簡體   English   中英

刪除與Hibernate關聯的OneToMany上的記錄

[英]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_iduserCodeEntity Part實現了equals和hashCode。 還有一個Entity Factory ,所有關聯都從該Entity Factory “開始”到其他實體。 因此,為了保存所有更改,只需執行命令即可:

session.update(factory);

除從零件中刪除外,所有更改均已成功保存。 我做:

products.getParts.remove(part);

出現的問題是:

1)在某些情況下是partSet不除去雖然相比於partSetequals true返回(該part是在Set根據等號,但它不被除去)

2)即使Setremove成功完成,數據庫中的記錄也不會被刪除。

根據上述確定,在這種情況下不使用查詢來刪除記錄的最佳方法是什么?

您需要明確刪除子項:

session.delete(part);

Hibernate Docs中

如下代碼:

 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(); 

使用休眠模式映射關系時,必須注意兩個主要問題:

  • 關系的所有者是誰? 所有者是關系的一方,其更改將保留在數據庫中。 在您的情況下,所有者是Part對象。
  • 是真正的父母/子女關系,還是僅僅是構成關系? 在您的情況下,我認為答案是構圖

如果要使用集合管理關系,則有兩個選擇:

  • 使用@ElementCollection而不是@OnetoMany
  • 更改所有權。 像這樣:

     @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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM