GAE JPA2 アプリケーションの OneToMany 関係に問題があります。
私は2つのクラスを持っています:
@Entity(name="A")
public class A {
@Id
private String uuid;
@OneToMany(mappedBy="a")
private List<B> bList;
public A() {
//set uuid
bList = new ArrayList<B>();
}
public List<B> getBList() {
return bList;
}
//Other getters and setters
public static A create() {
EntityManager em = //get entity manager
A a = new A();
try {
em.persist(a);
} catch(Exception e) {
return null;
} finally {
em.close();
}
return a;
}
public static A getA(String uuid) {
EntityManager em = // get EM
A a = em.find(A.class, uuid);
em.close();
return a;
}
public void update() {
EntityManager em = // create EM
try {
em.merge(this);
} finally {
em.close();
}
}
}
@Entity (name="B")
public class B
{
//id stuff
@ManyToOne(fetch=FetchType.EAGER)
A a;
public B(A a) {
//create key using 'a' as parent
this.a = a;
}
public static B create(A a) {
EntityManager em = //create EM
B b = new B(a);
try {
em.persist(b);
} catch (Exception e) {
return null;
} finally {
em.close();
}
return b;
}
//get and update methods similar to the A class above
}
そして、次のことを行っている小さなテストベッド サービスがあります。
String uuid; //hardcoded to match an existing uuid in the datastore
A a = A.getA(uuid);
B b = B.create(a);
a.getBList().add(b);
a.update();
なぜリストが分離されないのか混乱しています... FetchType が LAZY であれば理解できましたが、そうではありません... EAGER に設定されています。
何か案は?
UPDATE テストベッドサービスで次の行のみを使用するだけで、問題を再現できます
String uuid; //hardcoded to match an existing uuid in the datastore
A a = A.getA(uuid)
a.getBList();