Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA-一对多注释和id生成_Jpa_Eclipselink_One To Many - Fatal编程技术网

JPA-一对多注释和id生成

JPA-一对多注释和id生成,jpa,eclipselink,one-to-many,Jpa,Eclipselink,One To Many,我正在使用以下技术堆栈:WebSphereLiberty,JPA/Eclipselink 我必须确定实体的类型: Employer Employee 他们是一对多关系,即雇员有雇主,雇主有雇员 我已经设置了CASCADE_类型的注释,所以当我持久化一个雇员时,它的所有雇员也会持久化 我使用以下代码: em.getTransaction().begin(); em.merge(anEmpoyer); //some application logic //em.flush(); enter cod

我正在使用以下技术堆栈:WebSphereLiberty,JPA/Eclipselink

我必须确定实体的类型:

Employer
Employee
他们是一对多关系,即雇员有雇主,雇主有雇员

我已经设置了CASCADE_类型的注释,所以当我持久化一个雇员时,它的所有雇员也会持久化

我使用以下代码:

em.getTransaction().begin();
em.merge(anEmpoyer);
//some application logic
//em.flush();
enter code here
em.getTransaction().commit();
我好奇的是,实体的生成ID是如何填充的

调用merge时,我可以看到一个员工的id已填充,但不同员工的id未填充

当我调用flush时,我可以看到INSERT语句正在运行,但仍然只有anEmloyer的id被填充

调用commit之后,所有的id都被填充

我的问题是:JPA Eclipselink到底是如何处理id填充的?有没有一种方法可以在提交之前获取所有ID,而无需创建另一个事务

谢谢,
krisy

您应该能够通过创建@PostPersist回调方法来检索任何生成的键。据我所知,任何生成的密钥最迟应在刷新后即提交前可用

根据JPA 2规范:

调用PostPersist和PostRemove回调方法用于 实体被持久化或删除后的实体。这些 回调也将在所有实体上调用,这些实体将被调用 操作是级联的。PostPersist和PostRemove方法将 在数据库插入和删除操作之后调用 分别地这些数据库操作可能直接发生在 已调用持久化、合并或删除操作,或者可能会调用这些操作 在发生刷新操作后直接发生,该操作可能在 交易的结束。生成的主键值是 在PostPersist方法中可用


您是否将jpa与仪表一起使用?是的,对不起;我忘了提那件事——更新了问题。顺便说一句:这有什么关系?您可以尝试的是在通过方法调用进行提交之前请求一个缺少的ID。如果您使用的是instrumentation eclipselink,则可能会初始化该值并将其返回。如果仪器不可用,我认为这不会发生。开发人员犯的另一个错误是,他们在调试类变量时看到id为null,但没有意识到如果他们调用say getId,它将不会为null,因为jpa已经检测了这个方法,我尝试调用getId,但得到了0:-这是预期的-如果您没有检测。你的推荐类型是什么?一般来说,将关键引用类型设置为