JTA CMT交易边界 - 交易的开始和结束?

时间:2012-07-20 00:05:43

标签: java java-ee transactions jta

我的Java EE应用程序出了问题 - 一般来说,我坚持一个对象,发送一个JMS,而在MDB上我试图找到那个对象 - 有时候它会起作用,但有时候我会在JPA上收到null找。我怀疑交易没有完成,但我找不到解决办法。

我不确定我是否理解正确 - 在CMT中,事务在调用@Local或@Remote接口的会话Bean方法时开始?如果我在这个会话Bean中有一系列方法并且只有其中一个持久保存我的对象,那么会在一个事务中调用所有链式方法吗?如果其中一些也暴露在接口中会怎么样?

发送JMS是链接方法之一 - 我是否应该在接口中公开此方法并在持久保存对象的方法之后调用它?如果我不想在接口中公开该方法怎么办?

抱歉缺乏EJB知识。感谢您的帮助:))

2 个答案:

答案 0 :(得分:0)

您是否坚持并使用相同的实体管理器找到您的对象?

如果您处于之前持久存在对象的同一事务中,则始终可以找到您的对象。 如果持久化并找到具有不同事务的对象,则在持久化事务提交之前,您无法看到该对象。

我的建议是:使用相同的交易,这样您就可以随时找到您的对象。或者在Java EE应用程序中,只需使用相同的实体管理器。

答案 1 :(得分:0)

我建议你不要在MDB bean中编写逻辑,使用会话bean,然后将其注入MDB。关于方法调用,如果要在同一个类中调用方法,即使通过提供@REQUIRES_NEW属性,也不会打开新事务。为了做到这一点,注入bean本身并调用注入的bean,这将打开新的事务。