级联持久化java.util.Map<;实体,基本>;使用@ElementCollection

级联持久化java.util.Map<;实体,基本>;使用@ElementCollection,java,jpa,eclipselink,Java,Jpa,Eclipselink,我尝试级联持久化以下两个JPA实体(getter/setter和其他字段ommited): 但当我这样做时,我得到以下例外: java.lang.IllegalStateException:在同步过程中,通过关系找到了一个新对象 未标记为cascade PERSIST:TestKey的 我可以通过在保存实体之前先保存密钥来修复此问题,如下所示: [...] em.persist(key); // <<-- line added to previous example em.persi

我尝试级联持久化以下两个JPA实体(getter/setter和其他字段ommited):

但当我这样做时,我得到以下例外:

java.lang.IllegalStateException:在同步过程中,通过关系找到了一个新对象 未标记为cascade PERSIST:TestKey的

我可以通过在保存实体之前先保存密钥来修复此问题,如下所示:

[...]
em.persist(key); // <<-- line added to previous example
em.persist(entity);
em.getTransaction().commit();
em.close();
[…]

em.persist(键);//通过使用实体引用,您已经使其超出了简单的基本映射集合中所涵盖的范围。这是在以后的JPA规范版本中添加的功能,它们需要像任何其他实体引用一样对待,因为它们有自己的标识和生命周期。谢谢Chris,你的意思是,更新到从不版本的EclipseLink可能会解决问题吗?@Chris刚刚更新到最新版本的EclipseLink,但这并没有改变任何事情……不,我指的是规范中的说明。元素集合最初是基本映射,因此被记录为基本映射。对其中实体的支持来得较晚,因为它们是实体,有自己的生命周期,并且假定存在于引用实体之外。您必须显式地管理这些被引用的实体,或者如果您希望TestEntity实例将它们视为私有的,则必须使它们成为可嵌入的对象。
EntityManager em = ...
em.getTransaction().begin();

TestKey key = new TestKey();
key.setName("some key");
TestEntity entity = new TestEntity();
entity.getProperties().put(key, "some value");

em.persist(entity);
em.getTransaction().commit();
em.close();
[...]
em.persist(key); // <<-- line added to previous example
em.persist(entity);
em.getTransaction().commit();
em.close();