Hibernate 冬眠和日食行为不一致

Hibernate 冬眠和日食行为不一致,hibernate,orm,jpa,eclipselink,Hibernate,Orm,Jpa,Eclipselink,下面的代码(简化版)通过了Hibernate下的JUnit测试,但没有通过EclipseLink下的测试。在日食下,需要什么才能使这项工作正常进行 public static void store(EntityManager em, String a, String b) { Entry entry=new Entry(); entry.setFirst(a); entry.setLast(b); em.persist(entry); em.persist

下面的代码(简化版)通过了Hibernate下的JUnit测试,但没有通过EclipseLink下的测试。在日食下,需要什么才能使这项工作正常进行

public static void store(EntityManager em, String a, String b) {
    Entry entry=new Entry();
    entry.setFirst(a);
    entry.setLast(b);
    em.persist(entry);
    em.persist(new SubEntry(entry.getId(), a, b));
}
它失败,因为entry.getId()在使用EclipseLink时返回0。检索刚刚存储的对象的唯一标识符的适当方法是什么


显然,上面的代码没有意义,因为在事务提交之前执行entry.getId()可能没有意义,但是hibernate允许这样做。

这里发生了一些事情。除非您为您的实体类提供一些代码,否则我们无法知道您正在使用何种策略生成主键。假设您使用的策略允许数据库为
条目
类生成主键,例如序列或自动编号列。让我进一步假设您正在活动事务中调用此方法。如果您在调用
em.persist(entry)
之后立即插入对
em.flush()
的调用,那么考虑到我上面提到的假设,我认为这会起作用


我看到的未知问题是,当您第二次调用
em.persist()
时,
entry
是否是对托管实体的引用,以及是否为其分配了id(主键)值。

您的假设是正确的。谢谢你的指点,你已经确认没有简单的答案了!eclipselink和hibernate对JPA规范的实现不一致,这是一个有趣的问题。看来em.flush()就是答案。我们现在担心代码中还有多少地方会出现这个问题!!我会投票支持你的答案,但我似乎不被允许,因为我是新来的。抱歉。我认为默认的“刷新”模式是自动模式,它允许提供程序在需要时刷新数据库的挂起更改,并且在不同的提供程序之间会有所不同。此外,只有在em.flush之前,该值才会出现,仅用于标识排序。