【问题标题】:Datanucleus Google App Engine One-To-Many relationshipDatanucleus Google App Engine 一对多关系
【发布时间】:2012-07-31 13:45:19
【问题描述】:

我有以下代码:

@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”的对象由不同的对象管理器管理

【问题讨论】:

  • 并且“现有服务请求”由不同的 EntityManager 管理,您可以通过使用 EM 上的方法轻松检查它正在管理的内容。如果分离,则不受任何管理
  • 所以不可能将现有的(已经持久化的)对象添加到新的对象中?或者也许我可以以某种方式将它附加到我的事件中?
  • 当然有可能......当它由同一个 EntityManager 管理时(如 JPA 规范所说)。您没有提供从哪里获得此现有对象的信息

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


【解决方案1】:

我建议您从以下开始,然后告诉您深入研究有关所有数据存储的文档 JDO Stuff。然后感谢谷歌。 :-)

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

  • 获取新的 PersistenceManager
  • 获取您需要的EntityA
  • 用它做任何你想做的事,包括从其他类实例化其他实体并以某种方式将它们全部链接起来
  • 使用 pm 持久化所有内容
  • 关闭下午

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

JDO doc - Google

【讨论】:

  • 好的 - 它工作:)。但是我使用的是 EntityManager 而不是 PersistentManager - 使用这两者有区别吗?现在我遇到了另一个问题——当我试图从数据库中获取我的“事件”时,他们的请求字段为空。我正在使用代码EntityManager em = EMF.get().createEntityManager(); Query q = em.createQuery("select i from Incident i order by incidentId"); List&lt;Incident&gt; list = q.getResultList(); 获取他们的信息
  • 它正在工作。当您拥有 List 时,Request 字段为空,直到您访问它(在您关闭 EntityManager 之前!)只需访问它,它将即时加载。它被称为延迟加载,一种节省资源的技术。阅读我对This question的回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-17
  • 2016-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多