【问题标题】:EclipseLink - bidirectional OneToMany relationEclipseLink - 双向 OneToMany 关系
【发布时间】:2013-05-27 02:28:22
【问题描述】:

假设我有两个实体:

@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 时,它返回空集。 这是正常行为吗?如果是,当我添加新的订单实体时,我该怎么做才能自动刷新这个集合?

【问题讨论】:

    标签: java jpa eclipselink


    【解决方案1】:

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

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

    【讨论】:

    • 我在尝试使用 em.find(...) 从 entitymanager 接收 OneToMany 关系时遇到了这个问题,但总是收到一个空列表。我总是保持关系是最新的,但是从 entitymanager 我总是收到一个空列表,我目前使用 em.refresh(...) 填充该列表。使用 em.find(...) 时我应该看到不同的行为吗?
    • 本,您必须提供更多详细信息,因为我看不出您如何调用 em.find() 来获得 OneToMany 关系。如果关系没有条目,或者数据库也没有条目,则缓存的 Entity 是陈旧的(例如,当您只添加到双向关系的一侧,或者在读取后更新不同 EntityManager 中的实体时从这个),或者您的映射不正确。如果 em.refresh 没有解决问题,那么很可能数据库没有您认为的那样,或者映射不正确。尝试在问题中发布详细信息
    • 克里斯,我意识到我不清楚。对此感到抱歉。这是一个关于我的问题的新问题:stackoverflow.com/questions/38760611/…
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-09
      • 1970-01-01
      • 2019-10-12
      • 2018-11-29
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多