我创建了一个映射到数据库表的实体。请注意,它包含对两个其他表中的两个外键的引用,并将这些条目存储为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>