Java EJB事务属性:不支持且需要新的

Java EJB事务属性:不支持且需要新的,java,hibernate,jakarta-ee,jpa,transactions,Java,Hibernate,Jakarta Ee,Jpa,Transactions,我目前被困在以下场景中: 我正在尝试将对象保存到数据库中。但是A是由很多其他对象组成的,B,C,B,C由对象D,E组成,有很多嵌套的对象,你知道我的意思。让我们调用保存为事务1的整个过程 在事务1的中间,当涉及到保存某个对象X(它通过许多链接与A关联)时,假设是方法saveX()触发了保存X。在saveX()方法中,业务逻辑需要对另一个对象Y执行另一个查询,假设该方法为queryY() 因此,当我们调用queryY()时,当它转到实际从数据库获取所有结果的代码行时,我们有一个异常。让我们把这个时

我目前被困在以下场景中:

我正在尝试将对象保存到数据库中。但是A是由很多其他对象组成的,B,C,B,C由对象D,E组成,有很多嵌套的对象,你知道我的意思。让我们调用保存为事务1的整个过程

在事务1的中间,当涉及到保存某个对象X(它通过许多链接与A关联)时,假设是方法saveX()触发了保存X。在saveX()方法中,业务逻辑需要对另一个对象Y执行另一个查询,假设该方法为queryY()

因此,当我们调用queryY()时,当它转到实际从数据库获取所有结果的代码行时,我们有一个异常。让我们把这个时刻称为T时间

例外是

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: A.b -> B.
所以我认为,EJB容器在T时间有点思考,当我们需要执行查询时,它需要提交当前事务1并启动事务2来执行查询。显然,与A相关的数据尚未正确保存到数据库中,因此出现了异常

因此,我们需要暂停事务1,并在执行查询后恢复它,而不是在T时间提交它。我做了一些研究,发现@TransactionAttribute可以解决这个问题。有趣的是,如果我将以下两种解决方案中的一种作为注释放在queryY()上,我发现这两种解决方案都有效(没有异常发生,应用程序也可以):

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) 
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
我阅读了与声明相关的官方文件:

需要新作品是有道理的。但我不明白为什么你不也这么做。显然,我们需要另一个事务来调用queryY()来完成查询。在对“不支持”的解释中,它没有提到在暂停第一个事务后将启动一个新事务

所以我的第一个问题是,为什么不支持工作? 我的第二个问题是,为什么EJB容器认为事务1已经结束,它需要在T时间提交,而不是将queryY视为事务1的一部分


提前谢谢!任何帮助都将不胜感激

这与事务传播无关。您应该使用一个且仅使用一个事务来保存所有对象

您可能会遇到以下错误:

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: A.b -> B.
是因为你试图保存A,而A和B之间没有级联


如果A是父级,B是子级(具有FK),那么将持久/合并操作从A级联到B是有意义的。否则,如果B是家长
@OneToOne
关联,您需要先保存该关联。

谢谢您的回答,但我不能同意。添加cascade=“cascade.ALL”无助于.org.hibernate.PropertyValueException:notnull属性引用空值或临时值:B.a.因此EJB容器仍然希望结束该事务并尝试保存,但在vainBy中,“如果a是父级,B是子级(有一个FK)”,您的意思是a是拥有方(没有mappedBy注释)?因此,如果我在A(拥有方)中添加CASCADEType.ALL,仍然是org.hibernate.transientObject异常:对象引用未保存的临时实例-在刷新之前保存临时实例:A.b->b。如果我在b(引用方)中添加CASCADEType.ALL,我有org.hibernate.PropertyValueException:notnull属性引用null或瞬态值:B.a。这是因为映射未正确设置。如果有双向关联,请确保设置了两个边,parent.children集合和child.parent边应同步。