首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

JPA 實體類自關聯映射:機構樹狀結構的 @ManyToOne 與 @OneToMany 完整配置

     編輯:程式設計綜合問答

業務場景

機構實體 Organization 包含 id、orgnName、parentId。資料呈現樹狀結構:頂層機構 parentId=0,子機構 parentId 指向父機構 id。需在單一實體類中實現自我關聯的多對一(父機構)與一對多(子機構集合)。

完整實體類程式碼

@Entity
@Table(name = "ORGANIZATION")
public class Organization {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    private Integer id;

    @Column(name = "ORGNNAME", nullable = false, unique = true)
    private String orgnName;

    // 多對一:指向父機構
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "PARENTID")
    private Organization parent;

    // 一對多:子機構集合
    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @OrderBy("id ASC")
    private List<Organization> children = new ArrayList<>();

    // Getter/Setter 省略...
}

關鍵註解解析

註解位置作用
@ManyToOne父機構欄位 parent宣告多對一關聯,多個子機構指向同一父機構
@JoinColumn(name="PARENTID")同 parent指定外鍵欄位名,對應資料表 PARENTID
@OneToMany(mappedBy="parent")子機構集合 children宣告一對多關聯,mappedBy 指向對方關聯欄位名
cascade = CascadeType.ALL@OneToMany級聯操作:儲存/刪除父機構時自動處理子機構
@OrderBy("id ASC")children查詢時自動按 id 升序排列子機構

常見坑點提醒

  • 雙向關聯維護:新增子機構時,需同時設定 child.setParent(parent) 並 parent.getChildren().add(child),否則關聯不完整。
  • 序列化循環引用:JSON 序列化時需加 @JsonIgnore 或 @JsonManagedReference/@JsonBackReference 避免無限遞迴。
  • 延遲載入陷阱:FetchType.LAZY 需在交易開啟時存取集合,否則拋出 LazyInitializationException。

掌握自關聯映射精髓,即可輕鬆構建機構樹、分類目錄、員工層級等階層式資料模型。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved