当前位置: 首页 > 知识库问答 >
问题:

EJB事务处理属性:不支持且需要新属性

刘向阳
2023-03-14

我目前陷入以下情况:

我正在尝试将对象A保存到数据库中。但是A是由很多其他物体组成的,B,C,B,C由D,E组成...有很多嵌套的对象,你知道我的意思。让我们把保存A的整个过程称为事务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时间提交它。我做了一些研究,我发现@TransactionAt的可以解决这个问题。有趣的是,我发现下面的两个解决方案都有效(没有异常发生,应用程序是好的),如果我把两个解决方案中的一个放在queryY()上作为注释:

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) 
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 

我阅读了与注释相关的官方文档:http://docs.oracle.com/javaee/6/api/javax/ejb/TransactionAttributeType.html

REQUIRES_NEW起作用是有道理的。但是我不明白为什么NOT_SUPPORTED也起作用。显然我们需要另一个事务来调用queryY()来完成查询。并且在NOT_SUPPORTED的解释中,它没有提到它会在暂停第一个事务后开始一个新的事务。

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

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

共有1个答案

柯河
2023-03-14

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

您得到的这个错误:

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关联,则需要首先保存该关联。

 类似资料:
  • 主要内容:1. 原子性,2. 一致性,3. 隔离性,4. 持久性事务具有四个属性,这些用于在事务之前和之后维护数据库的一致性。 事务属性 原子性(Atomicity) 一致性(Consistency) 隔离性(Isolation) 持久性(Durability) 1. 原子性 它声明事务的所有操作如有一个发生失败,则事务中止。 事务没有中途,即事务不能部分发生。 每个事务都被视为一个单元,并且运行完成或根本不执行。 原子性涉及以下两个操作: 中止: 如果事务中

  • 我们继续上一章节的内容,大家应该记得我们 Lua 代码中是如何完成 ngx_postgres 模块调用的。我们把他简单改造一下,让他更接近真实代码。 local json = require "cjson" function db_exec(sql_str) local res = ngx.location.capture('/postgres',

  • 问题内容: 我最近有一个关于如何在另一个类的主方法中打开登录面板的问题。因为我还没有在Swing中上过任何课(仅是基本的Java编程),所以我已经偶然发现了另一个问题。 我如何检测用户是否按下了JPanel中的按钮并使它执行某项操作。 例如:用户按下了登录-> if(textfield1.getText()==“ user”){打开另一个JFrame}->等等。 这是我的主要代码: 这是Login

  • Java EE7由一系列“bean”定义组成: 托管bean 1.0(JSR-316/JSR-250) 为了摆脱脑海中的混乱,我研究了几篇“什么时候用哪种豆型”的文章。EJB的优点之一似乎是它们单独支持声明性容器管理的事务(著名的事务注释)。不过,我不确定这是否正确。有人能批准吗? 同时,我提出了一个简单的演示应用程序来检查这是否是真的。我刚刚根据这个片段定义了一个CDIBean(不是EJB-它没

  • 是否在WCF DataContract属性中是必需的? 我有一个类,该类没有用DataContract或带有DataMember的属性标记。 当我在4台服务器上部署wcf服务时,out 4服务在3台服务器上运行正常,在1台服务器上失败,消息为“类型'类'无法序列化”。请考虑使用DataCoutAtinn属性标记它,并使用DataMemberAtinn属性标记所有想要序列化的成员。" 所以,在网络中

  • 问题内容: 在persistence.xml JPA配置文件中,可以有如下一行: 或有时: 我的问题是: 和之间有什么区别? 我还注意到缺少事务类型的一些persistence.xml文件。这是正确的吗? 问题答案: 默认值 在JavaEE环境中,默认值为 JTA ;在JavaSE环境中,默认值为 RESOURCE_LOCAL 。 RESOURCE_LOCAL 与您一起负责()创建和跟踪 您必须使