0

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

我这样尝试:

@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 查询可以实现我的目标。但是还有其他方法吗?

最好的祝福,

卡杰拉斯

4

2 回答 2

0

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

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

JPA 仅支持(理论上)READ_COMMITTED 隔离(请参阅Hibernate、spring、JPS 和隔离 - 不支持自定义隔离)以获得最终解决方法

于 2013-04-04T15:05:25.897 回答
0

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

于 2013-04-04T15:24:58.160 回答