我的GAE JPA2应用程序中的OneToMany关系存在问题。
我有两个班级:
@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。
有什么想法吗?
更新 我也可以通过在testbed服务中使用以下行来重现问题
String uuid; //hardcoded to match an existing uuid in the datastore
A a = A.getA(uuid)
a.getBList();
答案 0 :(得分:1)
b
之前,您忘了将其添加到a
的列表中。EntityManager
。保存A
和B
。