首先,我想在这种情况下解释我自己调用的ejb方法。我有一个有状态会话bean,其中有一个方法可以启动一个新事务(由@REQUIRES_NEW
注释)。要在bean内部调用此方法并使注释生效,我使用SessionContext#getBusinessObject()
来实现@EJB
的效果( @EJB
此处导致stackoverflow?!) 。我的代码如下所示:
@Stateful
@Local
public class TransactionTest implements ITransactionTest {
@PersistenceContext(unitName="Table",Type=PersistenceContextType.EXTENDED)
private EntityManager manager;
@Resource
SessionContext sc;
ITransactionTest me;
@PostConstruct
public void init(){
me = this.sc.getBusinessObject(ITransactionTest.class);
}
public void generateRecord(int i) throws RuntimeException{
Record record = new Record();
record.setId(i+"");
record.status(1);
manager.persist(record);
manager.flush(); //If not flush, result is correct. Why?
me.updateRecord(i);
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void updateRecord(int i) throws RuntimeException{
try {
Record record = manager.find(Record.class, i+"");
record.setStatus(2);
manager.flush();
} catch(Exception e) {
e.printStackTrace();
throw new RuntimeException();
}
}
}
同时,generateRecord()
正常运行。控制台显示它执行'insert'和'update'HQL而没有任何异常(我使用Hibernate作为JPA提供程序)。但是,“更新”结果不会出现在数据库中。 为什么? updateRecord()
是否正确提交?
另外,我以两种方式尝试:首先是在另一个bean中连续调用generateRecord()
(它将不再调用updateRecord()
)和updateRecord()
。它可以给我正确的结果。
第二个是删除第一个flush()
。然后“插入”和“更新”HQL都将在第二个flush()
执行。这种方法也可以产生正确的结果。
我的程序在JBOSS 6.1.0-Final下运行,数据库是Oracle。
最诚挚的问候,
Kajelas