EclipseLink – 双向OneToMany关系

假设我有两个实体:

@Entity public class Customer implements Serializable { ... @OneToMany(cascade=ALL, mappedBy="customer") public Set getOrders() { return orders; } ... } @Entity public class Order implements Serializable { ... @ManyToOne @JoinColumn(name="CUST_ID", nullable=false) public Customer getCustomer() { return customer; } ... } 

然后,我是持久的Customer实体,之后,Order实体参考之前添加的Customer。 当我从数据库中检索此客户并调用getOrders时,它返回空集。 这是正常的行为吗? 如果是,我在添加新订单实体时如何自动刷新此设置?

Jpa不为您维护关系,应用程序需要设置双向关系的两面以使它们与数据库保持同步。 在设置order-> customer relation时将订单添加到订单列表,如果客户已分离,则将其合并以对收集的集合进行更改。

否则,您将需要在事务之后使用em.refresh或带有刷新查询提示的查询进行明确刷新,或者从缓存中逐出客户。 无论哪种方式,它都需要通过维护关系的双方来轻松避免数据库命中。

如果您从同一个事务中检索客户,那么是,这是预期的行为。 原因是EntityManager返回它在其第一级缓存中的顺序,以及您自己创建的顺序,而不向其订单集添加任何顺序。 您有责任通过维护关联的两个方面来维护对象图的一致性:

 order.setCustomer(customer); customer.addOrder(order);