Jakarta ee 为什么在持久化后分离实体时找不到实体

Jakarta ee 为什么在持久化后分离实体时找不到实体,jakarta-ee,jpa-2.0,eclipselink,Jakarta Ee,Jpa 2.0,Eclipselink,我有一个容器管理事务的无状态会话Bean。我想在数据库中创建(持久化)非托管实体后返回它。我就是这样做的: @无状态 公共类MyBean{ @EJB(name=“MyController”) 私有MyController-MyController; 公共MyEntity创建(MyEntity实体){ //... myController.create(实体); myController.预转移(实体); 返回实体; } } @无状态 公共类MyController{ @PersistenceC

我有一个容器管理事务的无状态会话Bean。我想在数据库中创建(持久化)非托管实体后返回它。我就是这样做的:

@无状态
公共类MyBean{
@EJB(name=“MyController”)
私有MyController-MyController;
公共MyEntity创建(MyEntity实体){
//...
myController.create(实体);
myController.预转移(实体);
返回实体;
}
}
@无状态
公共类MyController{
@PersistenceContext(unitName=“myPU”)
私人实体管理者;
公共作废创建(MyEntity实体){
//...
em.persist(实体);
}
公共无效预转让(MyEntity实体){
如果(em.contains(实体)){
em.detach(实体);
}
//...
}
}
我调用MyBean.create,实体成功持久化,MyBean.create返回非托管实体,没关系。但下次我尝试按id检索此实体时,找不到它。若我注释detach,那个么可以找到实体,但在那个种情况下,MyBean.create返回托管实体。我错在哪里?

美国的javadoc:

对实体进行的未刷新更改(如有)(包括删除实体) 实体),将不会同步到数据库

所以你坚持它,然后分离它。但与persist关联的操作尚未刷新,因此实体未保存到数据库中


为什么要拆下它?一旦事务结束,它将自动分离。

修改JB的回答:您也可以使用干净的标准机制,而无需强制容器分离或清除:

@Stateless
public class MyController {

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public MyEntity create(MyEntity entity) {
       //...
       em.persist(entity);
       return entity;
    }
}

您将得到一个分离的实体。

好的,在这种情况下这将起作用。但是JPA不支持嵌套事务,这就是为什么它在更复杂的情况下不起作用的原因。例如,我想创建任何其他实体,在非托管状态下使用它们,并且所有实体都在同一事务中。我需要分离实体,因为我需要在从business Methods返回实体之前设置实体的一些字段听起来像是要返回数据传输对象而不是实体。为什么要返回一个不代表DB中状态的实体?@TuukkaMustonen引入DTO只是为了获得一个分离的实体,这是一个非常糟糕的主意,除非它是EJB2.1或更早版本(但这里没有)。为什么你认为实体是可序列化的?我同意Tuukka的观点。要么它是一个实体,应该表示持久状态,要么它应该是一个DTO。可以使用实体中的非持久性字段(即使它很难看,IMHO),但它们必须标记为@Transient。@MaDa听起来他想创建一个实体并返回实体实例,其中一些字段已更改(与数据库中的状态不同)。没有说过(或至少没有任何意思)关于序列化的事情?