GAE JPA DataNucleus 一对多对象创建

Posted

技术标签:

【中文标题】GAE JPA DataNucleus 一对多对象创建【英文标题】:GAE JPA DataNucleus One-to-Many object creation 【发布时间】:2010-09-23 19:03:31 【问题描述】:

假设一个 Owner 有一个 Watch(es) 集合。

我正在尝试创建手表并将新创建的手表添加到现有所有者的手表集合(数组列表)中。

我的方法如下:

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: Object "package.Owner@2b6fc7" has a collection "package.Owner.watches" yet element "package.Watch@dcc4e2" doesnt have the owner set. Managing the relation and setting the owner.

请问我该如何解决这个问题?谢谢!

实体:

所有者:

@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;

非常感谢您!

最诚挚的问候,

杰森

【问题讨论】:

老实说,我不知道这个问题是否应该作为重复问题关闭,但事实是有很多(非常)类似的问题:***.com/questions/2600021/…、***.com/questions/2921314/… 等. 我想当您不知道自己在寻找什么时,很难找到它们。 谢谢,帕斯卡!你是对的;我所拥有的只是错误消息,我不知道从哪个方向寻找答案。我尝试根据错误消息寻找解决方案,但无济于事。 你在这里提出了一个很好的观点,我现在相信这个问题在谷歌搜索相同的“错误消息”时可能会有所帮助。 【参考方案1】:

您的关联是双向的,但您没有正确设置链接的两端,正如错误消息所报告的那样。你的代码应该是:

...
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();

【讨论】:

以上是关于GAE JPA DataNucleus 一对多对象创建的主要内容,如果未能解决你的问题,请参考以下文章

Gae Jdo 对具有双向导航的一对多拥有关系的持久性

在 GAE 中使用任务队列插入批量数据

Datanucleus JPA 命名查询返回已删除的实体

带有嵌入式类型查询的 Mongo/DataNucleus/JPA 给出:找不到(部分)的类型...因为符号没有类型;隐式变量?

GAE ndb 存储大型一对多关系的最佳实践

未找到类 org.datanucleus.api.jdo.PersistenceManagerFactoryClass