我有无状态会话Bean和容器管理事务。我想在数据库中创建(持久化)后返回非托管实体。这就是我的方式:
@Stateless
public class MyBean {
@EJB(name="MyController")
private MyController myController;
public MyEntity create(MyEntity entity) {
//...
myController.create(entity);
myController.preTransfer(entity);
return entity;
}
}
@Stateless
public class MyController {
@PersistenceContext(unitName = "myPU")
private EntityManager em;
public void create(MyEntity entity) {
//...
em.persist(entity);
}
public void preTransfer(MyEntity entity) {
if (em.contains(entity)) {
em.detach(entity);
}
//...
}
}
我调用 MyBean.create ,实体成功保留, MyBean.create 返回非托管实体,没关系。但下次当我尝试通过id检索此实体时,无法找到它。如果我发表评论 detach ,则可以找到实体,但 MyBean.create 在这种情况下返回管理实体。哪里错了?
答案 0 :(得分:2)
EntityManager.detach
状态的javadoc:
对实体进行的未刷新更改(如果有)(包括删除 实体),不会同步到数据库
所以你坚持下去,然后分开它。但是与persist相关的操作尚未刷新,因此实体不会保存到数据库中。
你为什么要分开它?一旦交易结束,它将自动分离。
答案 1 :(得分:0)
修改JB的答案:您也可以使用干净的标准机制,而不必强制容器分离或明确刷新:
@Stateless
public class MyController {
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public MyEntity create(MyEntity entity) {
//...
em.persist(entity);
return entity;
}
}
结果你会得到一个分离的实体。