2

假设我有两个实体:

@Entity
public class Customer implements Serializable {
    ...
    @OneToMany(cascade=ALL, mappedBy="customer")
    public Set<Order> getOrders() { 
        return orders; 
    }
    ...
}

@Entity
public class Order implements Serializable {
    ...
    @ManyToOne
    @JoinColumn(name="CUST_ID", nullable=false)
    public Customer getCustomer() { 
        return customer; 
    }
    ...
}

然后,我坚持客户实体,之后,参考先前添加的客户的订单实体。当我从数据库中检索此客户并调用 getOrders 时,它返回空集。这是正常行为吗?如果是,当我添加新的订单实体时,我该怎么做才能自动刷新这个集合?

4

2 回答 2

7

Jpa 不会为您维护关系,应用程序需要设置双向关系的双方以保持它们与数据库同步。当您设置订单->客户关系时,将订单添加到订单列表中,如果客户已分离,请将其合并以获取对集合的更改。

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

于 2013-05-26T18:28:03.697 回答
2

如果您从同一交易中检索客户,那么是的,这是预期的行为。原因是 EntityManager 返回它在其一级缓存中的订单,并且是您自己创建的,没有向其订单集添加任何订单。通过维护关联的两侧来维护对象图的一致性是您的责任:

order.setCustomer(customer);
customer.addOrder(order);
于 2013-05-26T18:28:22.043 回答