[英]Delete a record on an OneToMany association with Hibernate
我正在使用Hibernate
應用程序,我想刪除數據庫中的某些記錄。 相關實體是:
@Entity
public class Product {
private String serialNumber;
private Set<Part> parts = new HashSet<Part>();
@Id
public String getSerialNumber() { return serialNumber; }
void setSerialNumber(String sn) { serialNumber = sn; }
@OneToMany
public Set<Part> getParts() { return parts; }
void setParts(Set parts) { this.parts = parts; }
...
}
@Entity
public class Part implements Serializable {
@Id
@GeneratedValue
private Long part_id;
private String userCode = "";
//getters and setters
....
}
我已經讓Eclipse基於part_id
和userCode
在Entity Part
實現了equals和hashCode。 還有一個Entity Factory
,所有關聯都從該Entity Factory
“開始”到其他實體。 因此,為了保存所有更改,只需執行命令即可:
session.update(factory);
除從零件中刪除外,所有更改均已成功保存。 我做:
products.getParts.remove(part);
出現的問題是:
1)在某些情況下是part
從Set
不除去雖然相比於part
在Set
有equals
true
返回(該part
是在Set
根據等號,但它不被除去)
2)即使Set
的remove
成功完成,數據庫中的記錄也不會被刪除。
根據上述確定,在這種情況下不使用查詢來刪除記錄的最佳方法是什么?
您需要明確刪除子項:
session.delete(part);
如下代碼:
Parent p = (Parent) session.load(Parent.class, pid); Child c = (Child) p.getChildren().iterator().next(); p.getChildren().remove(c); c.setParent(null); session.flush();
不會從數據庫中刪除c。 在這種情況下,它將僅刪除到p的鏈接,並導致違反NOT NULL約束。 您需要顯式delete()子級。
Parent p = (Parent) session.load(Parent.class, pid); Child c = (Child) p.getChildren().iterator().next(); p.getChildren().remove(c); session.delete(c); session.flush();
使用休眠模式映射關系時,必須注意兩個主要問題:
如果要使用集合管理關系,則有兩個選擇:
更改所有權。 像這樣:
@OneToMany @JoinColumn(name="part_id") public Set<Part> getParts() { return parts; } void setParts(Set parts) { this.parts = parts; }
但是, 此處不建議第二種選擇。 參見第2.2.5.3.1.2節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.