我的目标是将记录插入我的数据库,然后在新的事务中更新它。
我这样试试:
@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
答案 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
我认为问题已在该条目中得到解决。