EntityManager不返回完全填充新创建的条目的对象

时间:2014-05-23 19:02:49

标签: jsf jpa ejb persistence cdi

我创建了一个映射到数据库表的实体。请注意,它包含对两个其他表中的两个外键的引用,并将这些条目存储为Person和Escrow对象:

@Entity
@Table(name = "ESCROW_MANAGER")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "EscrowManager.findAll", query = "SELECT e FROM EscrowManager e"),
    @NamedQuery(name = "EscrowManager.findByUserId", query = "SELECT e FROM EscrowManager e WHERE e.escrowManagerPK.userId = :userId"),
    @NamedQuery(name = "EscrowManager.findByEscrowId", query = "SELECT e FROM EscrowManager e WHERE e.escrowManagerPK.escrowId = :escrowId"),
    @NamedQuery(name = "EscrowManager.findByActive", query = "SELECT e FROM EscrowManager e WHERE e.active = :active"),
    @NamedQuery(name = "EscrowManager.findByViewed", query = "SELECT e FROM EscrowManager e WHERE e.viewed = :viewed")})

public class EscrowManager implements Serializable {

    @EmbeddedId
    protected EscrowManagerPK escrowManagerPK;    

    @JoinColumn(name = "USER_ID", referencedColumnName = "USER_ID", insertable = false, updatable = false)
    @ManyToOne(optional = false)
    private Person person;

    @JoinColumn(name = "ESCROW_ID", referencedColumnName = "ID", insertable = false, updatable = false)
    @ManyToOne(optional = false)
    private Escrow escrow;

当我启动应用程序并向EM查询EscrowManagers列表时,它运行良好。

public List<EscrowManager> findAll() {
    javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
    cq.select(cq.from(entityClass));
    return getEntityManager().createQuery(cq).getResultList();
}

我得到一个完整的条目列表,每个EscrowManager都包含一个Person和Escrow字段,这些字段填充了正确的对象。一切都很好。

然后我使用em.persist()创建一个新的EscrowManager。这也似乎运作良好。我检查数据库,表中有新的EscrowManager条目。

但是当我再次向EM查询EscrowManager列表时......新列表包含所有的EscrowManagers,所有这些都完全填充了Person和Escrow对象,除了我添加的一个。这种情况发生在我添加的每一个新的。

为什么不像其他人一样填充?

如果我重新启动应用程序服务器,则所有EscrowManager条目将再次使用Person和Escrow字段完全填充。只有新条目才会出现这种情况。

有什么想法吗?

更新:根据评论中的要求:

该项目是一个Web应用程序,在应用程序服务器上使用EJB和CDI Managed Beans:

我的facelets页面调用EJB的“create”方法:

@Named("escrowController")
@SessionScoped
public class EscrowController implements Serializable {

    private Escrow current;

    @EJB
    EscrowFacade ejbFacade;

    public String create() {  
        getFacade().create(managerName, current);
        return "create";
    }
    ...

这是EJB。请注意,首先创建Escrow,然后使用新创建的Escrow中的ID创建EscrowManager。

@Stateless
public class EscrowFacade {

    @PersistenceContext(unitName = "EscrowPU")
    private EntityManager em;

    protected EntityManager getEntityManager() {
        return em;
    }

    public EscrowFacade() {
    }

    public void create(String managerName, Escrow escrow) {

        //create escrow
        getEntityManager().persist(escrow);
        getEntityManager().flush();

        //create escrow manager
        EscrowManagerPK pk = new EscrowManagerPK(managerName, escrow.getId());
        EscrowManager escrowManager = new EscrowManager(pk, 1, 1);
        getEntityManager().persist(escrowManager);        
        getEntityManager().flush();
    }
    ...

如果这有用,这是我们的持久性声明:

<persistence-unit name="EscrowPU" transaction-type="JTA">
    <jta-data-source>jdbc/swrescrow</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties/>
</persistence-unit>

0 个答案:

没有答案