機構實體 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),否則關聯不完整。@JsonIgnore 或 @JsonManagedReference/@JsonBackReference 避免無限遞迴。FetchType.LAZY 需在交易開啟時存取集合,否則拋出 LazyInitializationException。掌握自關聯映射精髓,即可輕鬆構建機構樹、分類目錄、員工層級等階層式資料模型。