使用EJB事务,当我在主外部事务中插入记录时,我无法在内部事务中找到它(由REQUIRES_NEW注释)

时间:2013-04-04 14:59:18

标签: java-ee jpa transactions ejb jta

我的目标是将记录插入我的数据库,然后在新的事务中更新它。

我这样试试:

@PersistenceContext(unitName="Table")
private EntityManager manager;

@EJB
private ITransactionTest itt;

public void insertRecord(int i) throws RuntimeException{
      Record record = new Record();
      record.setId(i+"");
      record.status(1);
      manager.persist(record);
      manager.flush();
      itt.updateRecord(i);
}

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void updateRecord(int i) throws RuntimeException{
      Record record = manager.find(Record.class, i+"");
      record.setStatus(2);
      manager.flush();
}

然而,它不起作用。我也尝试使用getReference()来检索我的记录,然后抛出一个异常,说找不到实体。似乎该实体不再驻留在持久化上下文中。

如果我删除了REQUIRES_NEW的注释,它就可以了,我可以成功更新我的记录。

那么如何在新交易中更新我的记录?如何在跨越事务的持久性上下文中将实体保持在托管状态?

似乎使用JPA执行更新sql查询可以实现我的目标。但还有其他方法吗?

最诚挚的问候,

Kajelas

2 个答案:

答案 0 :(得分:0)

“持久化上下文通常绑定到Java EE中的JTA事务,持久化上下文在事务边界(事务范围)开始和结束,除非您使用扩展实体管理器。”

来源:http://docs.jboss.org/hibernate/orm/4.0/hem/en-US/html/transactions.html

JPA仅支持(理论上)READ_COMMITTED隔离(请参阅Hibernate, spring, JPS & isolation - custom isolation not supported)以获取最终的解决方法

答案 1 :(得分:0)

看看http://www.adam-bien.com/roller/abien/entry/how_to_self_invoke_ejb
我认为问题已在该条目中得到解决。

相关问题