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

Hibernate/JPA 註解完全參考手冊:從實體映射到關聯關係

     編輯:Java 綜合教學

一份可速查的 Hibernate 註解大全

在 Spring Data JPA / Hibernate 開發中,註解配置已全面取代 XML。本文系統整理 實體定義、主鍵策略、字段映射、關聯關係 四大類高頻註解,附帶屬性詳解與代碼範例,適合開發時隨查隨用。

一、核心實體註解

註解作用關鍵屬性
@Entity聲明持久化實體類name(實體名,默認類名)
@Table指定映射表名、目錄、Schemaname, catalog, schema, uniqueConstraints
@Id標識主鍵字段無

二、字段映射:@Column 詳解

@Column(
    name = "username",        // 列名(默認屬性名)
    unique = false,           // 唯一約束
    nullable = false,         // 允許 NULL
    insertable = true,        // 包含在 INSERT
    updatable = true,         // 包含在 UPDATE
    columnDefinition = "",    // 自定義 DDL 片段(跨庫慎用)
    table = "",               // 次表名(多表映射)
    length = 255,             // 字符串長度
    precision = 0,            // 數值精度
    scale = 0                 // 小數位數
)

三、主鍵生成策略大全

1. JPA 標準:@GeneratedValue

策略含義適用場景
AUTO由持久化提供者決定通用,開發期
IDENTITY數據庫自增(MySQL/SQL Server)不支持 Sequence 的庫
SEQUENCE數據庫序列(Oracle/PostgreSQL)需配合 @SequenceGenerator
TABLE專用表模擬序列跨庫兼容,性能較差

2. Hibernate 擴展:@GenericGenerator 13 種策略

策略名特點典型用法
native跨庫自適應(Oracle→Sequence, MySQL→Identity)最常用,交給數據庫
uuid128位 UUID → 32位十六進制字符串分布式系統,空間佔用大
assigned應用程序手動分配業務主鍵,等同 JPA AUTO
identityMySQL/SQL Server 自增不可用於 Oracle
sequence調用數據庫 Sequence需指定 sequence 名稱
hilo / seqhiloHi/Lo 算法優化高併發寫入,較少用
increment單進程內存計數器集群禁用
foreign共享關聯實體主鍵一對一主鍵關聯
guid數據庫原生 GUID 函數MySQL uuid(), SQL Server newid()
uuid.hex同 uuid,建議用 uuid 替代-
sequence-identity立即檢索 Sequence 值需 JDBC 3.0+

3. 組合範例

// 方案 A:native(推薦)
@GeneratedValue(generator = "nativeGen")
@GenericGenerator(name = "nativeGen", strategy = "native")
private Long id;

// 方案 B:Oracle Sequence
@GeneratedValue(generator = "seqGen")
@GenericGenerator(name = "seqGen", strategy = "sequence",
    parameters = @Parameter(name = "sequence", value = "SEQ_USER"))
private Long id;

// 方案 C:一對一共享主鍵
@Id
@GeneratedValue(generator = "foreignGen")
@GenericGenerator(name = "foreignGen", strategy = "foreign",
    parameters = @Parameter(name = "property", value = "userInfo"))
@OneToOne
@PrimaryKeyJoinColumn
private UserInfo userInfo;

四、關聯關係映射

1. 一對一 @OneToOne

方式主表配置從表配置特點
主鍵共享@OneToOne @PrimaryKeyJoinColumn無主鍵註解主鍵值完全一致
外鍵關聯@OneToOne @JoinColumn(name="fk_col")@OneToOne(mappedBy="主表屬性")最常用,@JoinColumn 可省(默認 屬性名_主鍵名)
中間表@OneToOne @JoinTable(...)@OneToOne(mappedBy="...")解耦,適用雙向可選

2. 多對一 @ManyToOne(從表視角)

// 單向
@ManyToOne(cascade = {PERSIST, MERGE})
@JoinColumn(name = "dept_id")
private Department department;

// 雙向(配合 @OneToMany mappedBy)
@ManyToOne
@JoinColumn(name = "dept_id")
private Department department;

3. 一對多 @OneToMany(主表視角)

方式配置要點外鍵維護方備註
mappedBy(推薦)@OneToMany(mappedBy="department")從表(@ManyToOne 端)雙向關聯,不產生額外表
@JoinColumn@OneToMany @JoinColumn(name="dept_id")主表單向,主表控制外鍵
@JoinTable@OneToMany @JoinTable(...)中間表多對多退化形式

集合類型:List(保序)、Set(去重)、Map(@MapKey 指定 Key 字段)

4. 級聯與抓取策略

  • cascade:PERSIST、MERGE、REMOVE、REFRESH、ALL(實務常用 ALL)
  • fetch:LAZY(默認,按需加載)、EAGER(立即加載,慎用)

五、最佳實踐速查

  1. 主鍵首選 native,跨庫零改動
  2. 雙向關聯必配 mappedBy,避免雙表維護外鍵
  3. 集合字段初始化:private Set<Child> children = new HashSet<>(); 防 NPE
  4. @Column(nullable=false) + Bean Validation @NotNull 雙重保障
  5. 大字段(LOB)單獨映射:@Lob @Basic(fetch=LAZY)

收藏本文,下次寫 Entity 時再也不用查文檔!📌

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