假设所有者拥有 watch 的集合。
我正在尝试创建 watch 并将新创建的 watch 添加到现有所有者的 watch 集合(数组列表)中。
我的方法如下:
public void add(String ownerName, String watchName) {
Owner o = new OwnerDAO().retrieve(ownerName); //retrieves owner object without fail
EntityManager em = EMF.get().createEntityManager();
EntityTransaction t = em.getTransaction();
Watch w = new Watch(watchName);
Owner owner = em.merge(o);
t.begin();
owner.getWatches().add(w);
t.commit();
em.close();
}
代码在本地GAE环境下没有问题,但是在在线GAE环境下出现如下问题:
org.datanucleus.store.mapped.scostore.FKListStore$1 fetchFields:对象“package.Owner@2b6fc7”有一个集合“package.Owner.watches”,但元素“package.Watch@dcc4e2”没有所有者集。管理关系并设置所有者
。
请问我该如何解决这个问题?谢谢!
实体:
所有者:
@id
private String name;
@OneToMany(mappedBy = "owner",
targetEntity = Watch.class, cascade = CascadeType.ALL)
private List<Watch> watches= new ArrayList<Watch>();
观看:
@id
private String name;
@ManyToOne()
private Owner owner;
非常感谢您!
最诚挚的问候,
杰森
最佳答案
您的关联是双向的,但您没有正确设置链接的两端,如错误消息所报告的那样。您的代码应该是:
...
owner.getWatches().add(w);
w.setOwner(owner); //set the other side of the relation
t.commit();
一个典型的模式是使用防御性链接管理方法来正确设置关联的双方,像这样(在 Owner
中):
public void addToWatches(Watch watch) {
watches.add(watch);
watch.setOwner(this);
}
你的代码会变成:
...
owner.addToWatches(w);
t.commit();
关于google-app-engine - GAE JPA DataNucleus 一对多对象创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3781674/