JPA - @OneToMany - 维护关系 - 在设置新对象时解除引用旧对象

时间:2014-07-20 15:01:35

标签: jpa eclipselink java-ee-7

我遇到@OneToMany - 关系问题。我正在使用EclipseLink 2.5,我正在尝试维护双方,并希望直接在@Entity - 类中实现这一点,根据此linkthis

所以,我有ProductManufacturer,其中Manufacturer可以有Products的列表,而Product只有一个Manufacturer 。我想实现,您可以更改Manufacturer的{​​{1}}。因此,Product - 类的setManufacturer() - 方法将被调用:

Product

因此,如果public void setManufacturer(Manufacturer manufacturer) { if (this.manufacturer != null) { this.manufacturer.removeProduct(this); } this.manufacturer = manufacturer; manufacturer.addProduct(this); } 的{​​{1}}为Manufacturer,我们只需将Product添加到null - Product列表中。到目前为止,所有东西都运转良好。

但如果products已经有Manufacturer,然后有人更改了Product,我想从旧版Manufacturer的列表中删除Manufactuer 。因此,设置者中的Product - 语句应该保持关系。

问题在于,当我保存产品并返回到我列出Manufacturer所有if Products Manufacturer我更改Product的页面时出现在Manufacturer中。它不会从旧版本中删除。

我如何在Manufacturers - 班级内解决这个问题?我想我必须在旧@Entity上调用merge() - 方法,但我无法访问其中的Manufacturer。要在EntityManager执行此操作似乎不是非常好的代码。

因此。嗯。这让我发疯了。我希望你能明白我的意思。感谢任何tipps,抱歉中英文!

以下是两个类,我删除了不相关的部分:

Controller

1 个答案:

答案 0 :(得分:1)

不要在实体代码中执行此操作,请在业务逻辑中执行此操作。

Manufacturer manufacturer = ...;
Product product = em.find(Product.class, productId);
if (product.getManufacturer() != null) {
    product.getManufacturer().removeProduct(product);
}
product.setManufacturer(manufacturer);
manufacturer.addProduct(product);

em.merge(product);
em.merge(manufacturer);

实体代码应仅用于管理成员变量和关系。