无状态EJB之间的持久化上下文

时间:2016-12-20 16:30:14

标签: java hibernate jpa

我有一个方法(比如方法A),我将实体保存到db;这个方法在EJB One中。在方法A中,在合并实体之后,我调用另一个方法(比如方法B),它需要处理方法A中保存的数据。方法B在EJB Two中。 这两个EJB都是无状态的,但在EJB One中我使用EJB Two的本地接口。 两者都有:

@PersistenceContext(unitName = "emDevices")
    private EntityManager em;

当方法B从DB读取数据时,无法找到先前在方法A中保存的新数据。 我试图使用@TransactionAttribute(TransactionAttributeType.SUPPORTS)而没有任何成功。 有谁知道为什么方法B看不到方法A保存的数据,即使它们使用相同的持久化上下文?

我使用hibernate 4.0.0和weblogic 12.1.3(J2EE6)

1 个答案:

答案 0 :(得分:2)

如果我理解正确,那么在EJB One中注入EJB 2。如果在EJB One上没有设置TransactionAttribute,则默认为REQUIRED,如果尚未启动事务,则将启动事务。需要事务才能保留数据。然后,如果在EJB One中注入EJB Two并调用EJB Two的方法,则会传播事务。一切都应该没问题。你是对的,共享持久化上下文。因此,应该能够阅读,以前写过的内容,如果真的是同一个交易。

A)你对看数据的意思是什么?我想你用em.find?然后,没关系;如果你的意思是一个查询,很明显查询不会返回数据,因为它仍然在持久化上下文中;数据将在交易结束时提交。

那么,如果不是A)中提到的那一点,那可能是错的?

  • 我会通过在两个方法中打印出它的实例来检查它是否真的是相同的持久化上下文;它应该是相同的地址。
  • 真的是同一笔交易吗?
  • 您的代码是否确实如此,您所描述的是什么?在我看来,它应该工作。那么可能存在隐藏的差异?

如果我的回答不够,请发一点代码;那么我们可能会帮助他们。