Datanucleus Google App Engine一对多关系

时间:2012-07-31 13:45:20

标签: java google-app-engine jpa-2.0 datanucleus

我有以下代码:

@Entity
public class Incident {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true")
    private String incidentId;

    @Persistent
    @Extension(vendorName="datanucleus", key="gae.pk-id", value="true")
    private Long keyId;


    @OneToMany(mappedBy="incident")
    @OrderBy("requestId")
    @JoinColumn(name="INCIDENT_ID")
    public List<ServiceRequest> requests;

    ...
}

@Entity
public class ServiceRequest {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true")
    private String requestId;

    @Persistent
    @Extension(vendorName="datanucleus", key="gae.pk-id", value="true")
    private Long keyId;
    private Incident incident;

    ...
}

使用它的场景首先是创建并持久化ServiceRequest,然后创建一个事件并将其添加到现有的ServiceRequest中 - 但是当我尝试保留事件时,我遇到了以下错误 引起:org.datanucleus.exceptions.NucleusUserException:id为“agxzbWFydGNpdHlhZ2hyFAsSDlNlcnZpY2VSZXF1ZXN0GAEM”的对象由不同的对象管理器管理

1 个答案:

答案 0 :(得分:1)

我会以如下方式开始您的工作,然后告诉您深入学习有关所有数据存储区JDO Stuff的文档。然后感谢谷歌。 :-)

您必须使用相同的持久性管理器一次完成所有读取/创建/保存/更新任务。这意味着在相同的方法或代码块中,您必须:

  • 获取新的PersistenceManager
  • 获取您需要的EntityA
  • 随心所欲地做任何事情,包括从其他类中实例化其他实体,并以某种方式将它们全部链接
  • 使用pm来保留所有内容
  • 关闭pm

问题是,如果您使用多个实体,则需要使用相同的PersistenceManager实例。

JDO doc - Google