Java Datanucleus谷歌应用程序引擎一对多关系
我有以下代码:Java Datanucleus谷歌应用程序引擎一对多关系,java,google-app-engine,jpa-2.0,datanucleus,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(vendo
@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;
...
}
@实体
公开课事件{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@扩展名(vendorName=“datanucleus”,key=“gae.encoded pk”,value=“true”)
涉及的私人字符串;
@持久的
@扩展名(vendorName=“datanucleus”,key=“gae.pk id”,value=“true”)
私有长密钥ID;
@OneToMany(mappedBy=“事件”)
@OrderBy(“requestId”)
@JoinColumn(name=“事件ID”)
公开名单请求;
...
}
@实体
公共类服务请求{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@扩展名(vendorName=“datanucleus”,key=“gae.encoded pk”,value=“true”)
私有字符串请求ID;
@持久的
@扩展名(vendorName=“datanucleus”,key=“gae.pk id”,value=“true”)
私有长密钥ID;
私人事件;
...
}
使用它的场景是首先创建并持久化ServiceRequest,然后创建一个事件并将现有的ServiceRequest添加到其中——但当我尝试持久化一个事件时,出现了以下错误
由以下原因引起:org.datanucleus.exceptions.nucleuserexception:id为“agxzbWFydGNpdHlhZ2hyFAsSDlNlcnZpY2VSZXF1ZXN0GAEM”的对象由另一个对象管理器管理我建议您从以下步骤开始,然后告诉您深入研究有关所有数据存储、JDO内容的文档。然后感谢谷歌。:-) 必须使用同一个持久性管理器一次执行所有读取/创建/保存/更新任务。这意味着在相同的方法或代码块中,您必须:
- 找一个新的PersistenceManager
- 把你需要的东西拿来
- 用它做任何你想做的事情,包括实例化其他类中的其他实体,并以某种方式将它们链接起来
- 使用pm保存所有内容
- 关闭pm
我建议您从以下内容开始,然后告诉您深入研究有关所有数据存储、JDO内容的文档。然后感谢谷歌。:-) 必须使用同一个持久性管理器一次执行所有读取/创建/保存/更新任务。这意味着在相同的方法或代码块中,您必须:
- 找一个新的PersistenceManager
- 把你需要的东西拿来
- 用它做任何你想做的事情,包括实例化其他类中的其他实体,并以某种方式将它们链接起来
- 使用pm保存所有内容
- 关闭pm
而“现有服务请求”由另一个EntityManager管理,您可以使用EM上的方法轻松检查该EntityManager,查看它正在管理什么。如果已分离,则它不由任何东西管理,因此不可能将现有(已持久化)对象添加到新对象中?或者我可以把它和我的事件联系起来?当然有可能。。。。当它由同一个EntityManager管理时(如JPA规范所述)。您不提供从何处获得此现有对象的信息,“现有服务请求”由另一个EntityManager管理,您可以使用EM上的方法轻松检查该EntityManager以查看其管理的内容。如果已分离,则它不由任何东西管理,因此不可能将现有(已持久化)对象添加到新对象中?或者我可以把它和我的事件联系起来?当然有可能。。。。当它由同一个EntityManager管理时(如JPA规范所述)。您不提供从OK获得此现有对象的位置信息-它工作:)。但是我使用的不是PersistentManager而是EntityManager——这两者之间有区别吗?现在我遇到了另一个问题——当我试图从数据库中获取我的“事件”时,它们的请求字段为空。我正在使用代码
EntityManager em=EMF.get().createEntityManager()获取它们;Query q=em.createQuery(“通过incidentId从事件i顺序中选择i”);List List=q.getResultList()代码>我还尝试将请求字段从public更改为private,并创建适当的setter和getter,但仍然不起作用。当您拥有列表时,请求字段为空,直到您访问它(在您关闭EntityManager之前!),只要访问它,它就会被动态加载。这叫做延迟加载,一种节省资源的技术。阅读我对OK的回答——它起作用了:)。但是我使用的不是PersistentManager而是EntityManager——这两者之间有区别吗?现在我遇到了另一个问题——当我试图从数据库中获取我的“事件”时,它们的请求字段为空。我正在使用代码EntityManager em=EMF.get().createEntityManager()获取它们;Query q=em.createQuery(“通过incidentId从事件i顺序中选择i”);List List=q.getResultList()代码>我还尝试将请求字段从public更改为private,并创建适当的setter和getter,但仍然不起作用。当您拥有列表时,请求字段为空,直到您访问它(在您关闭EntityManager之前!),只要访问它,它就会被动态加载。这叫做延迟加载,一种节省资源的技术。读我对你的回答