【发布时间】:2014-07-20 15:01:34
【问题描述】:
我对@987654323@-Relation 有疑问。我正在使用 EclipseLink 2.5,我正在尝试维护双方,并希望根据 link 和 this 直接在 @Entity-Classes 中实现这一点。
所以,我有Product 和Manufacturer,其中Manufacturer 可以有Products 的列表,Product 有一个Manufacturer。我想实现,您可以更改Product 的Manufacturer。因此将调用Product-Class 的setManufacturer()-Method:
public void setManufacturer(Manufacturer manufacturer) {
if (this.manufacturer != null) {
this.manufacturer.removeProduct(this);
}
this.manufacturer = manufacturer;
manufacturer.addProduct(this);
}
所以,如果Product 的Manufacturer 是null,我们只需将Product 添加到products 的Manufacturer 列表中。到这里一切正常。
但是如果Product 已经有Manufacturer,然后有人更改了Manufactuer,我想从旧Manufacturer 的列表中删除Product。因此setter中的if-statement,它应该保持关系。
然后问题是,当我保存产品并返回到列出所有Products 的Manufacturer 的页面时,我更改了Product 的Manufacturer 出现在两个Manufacturers 中。它不会从旧版本中删除。
如何在@Entity-Class 中解决这个问题?我想我必须在旧的Manufacturer 上调用merge()-Method,但我无法访问其中的EntityManager。而在Controller 上执行此操作似乎不是很好的代码。
所以。嗯。这让我快疯了。我希望你能明白我的意思。感谢您的任何提示,对于中等英语感到抱歉!
这里是两个类,我去掉了不相关的部分:
@Entity
public class Product extends ShopBaseEntity implements Serializable {
@Getter
@ManyToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST})
private Manufacturer manufacturer;
public void setManufacturer(Manufacturer manufacturer) {
if (this.manufacturer != null) {
this.manufacturer.removeProduct(this);
}
this.manufacturer = manufacturer;
manufacturer.addProduct(this);
}
}
@Entity
public class Manufacturer extends ShopBaseEntity implements Serializable {
public Manufacturer() {
super();
}
public Manufacturer(String name) {
super(name);
}
@Getter
@Setter
@OneToMany(mappedBy = "manufacturer")
private List<Product> products;
public void addProduct(Product product) {
if (products == null) {
products = new ArrayList<>();
}
if (!products.contains(product)) {
products.add(product);
}
}
public void removeProduct(Product product) {
if (products != null) {
products.remove(product);
}
}
【问题讨论】:
标签: jpa eclipselink java-ee-7