@Stateless @LocalBean
public class MySLSB {
@Resource
SessionContext ctx;
@PersistenceContext(unitName = "myPU")
EntityManager em;
public void T1() {
em.persist(new MyEntity(1L)); //T1 created!
/* wrong call to plain java object
T2();
*/
//corrected by lookup its business object first
ctx.getBusinessObject(MySLSB.class).T2();
ctx.setRollbackOnly();
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void T2() {
em.persist(new MyEntity(2L)); //T2 created!
}
}客户端调用T1(),首先应该提交一个新事务的T2,但是T1将被回滚。
预期结果:
T1:插入肌实体集id=1;
T2:插入肌实体集id=2;
T2:提交;
T1:回滚;
->带有id=2的行是在DB中创建的。
实际结果:
插入肌实体集id=1;
插入肌实体集id=2;
回滚;
->在DB中没有创建任何内容。
有什么问题吗?非常感谢!
发布于 2010-07-26 13:50:23
@解决方案
问题解决了。我犯了一个天真的错误。
对T2()的调用应该查找其业务对象,对T2()的直接调用只是对其普通java对象的调用。
我更新了上面问题上的代码,使一切都如期而至。
发布于 2010-10-14 04:05:16
声明自引用@EJB MySLSB me;和调用me.T2();可能比使用ctx.getBusinessObject(MySLSB.class)更容易。但感觉是一样的。
https://stackoverflow.com/questions/3334915
复制相似问题