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

Hibernate 註解開發完全手冊:核心註解、關聯映射與主鍵策略

     編輯:Java 綜合教學

註解開發優勢

JPA 註解 (`javax.persistence.*`) 為標準化規範,可移植性強;Hibernate 專有註解 (`org.hibernate.annotations.*`) 提供增強功能(如 `@Proxy`、`@BatchSize`、`@Where`)。實際項目常**混合使用**:JPA 註解作為基礎,Hibernate 註解補充特有需求。

實體類基礎註解

註解包作用關鍵屬性
@Entityjavax.persistence聲明持久化實體類`name`:實體名稱 (HQL 查詢用)
@Entityorg.hibernate.annotationsHibernate 擴展實體功能`dynamicUpdate`/`dynamicInsert`、`selectBeforeUpdate`、`polymorphism`
@Tablejavax.persistence指定映射表名、Schema、唯一約束`name`、`schema`、`catalog`、`uniqueConstraints`
@Proxyorg.hibernate.annotations類級別延遲加載策略`lazy=true/false` (默認 true),`proxyClass`

主鍵與標識符生成

註解包說明典型組合
@Idjavax.persistence標識主鍵屬性/字段配合 @GeneratedValue
@GeneratedValuejavax.persistence主鍵生成策略`strategy`:AUTO/IDENTITY/SEQUENCE/TABLE
@SequenceGeneratorjavax.persistence定義序列生成器 (Oracle/PostgreSQL)`name`、`sequenceName`、`allocationSize`
@TableGeneratorjavax.persistence定義表生成器 (通用、可移植)`name`、`table`、`pkColumnName`、`valueColumnName`
@GenericGeneratororg.hibernate.annotationsHibernate 通用生成器 (uuid、assigned、hilo 等)`name`、`strategy`、`parameters`

主鍵策略代碼示例

// 1. 自增 (MySQL/SQL Server)
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

// 2. 序列
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_gen")
@SequenceGenerator(name = "seq_gen", sequenceName = "SEQ_ID", allocationSize = 1)
private Long id;

// 3. UUID (跨庫無關)
@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")
private String id;

// 4. 表生成器
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "table_gen")
@TableGenerator(name = "table_gen", table = "ID_GEN", pkColumnName = "GEN_KEY", valueColumnName = "GEN_VALUE")
private Long id;

列映射與基本類型

註解包作用常用屬性
@Columnjavax.persistence字段級映射細節`name`、`nullable`、`unique`、`length`、`precision`、`scale`、`columnDefinition`、`insertable`/`updatable`
@Transientjavax.persistence標識非持久化屬性 (忽略映射)無
@Temporaljavax.persistence日期時間類型映射`value`:DATE/TIME/TIMESTAMP
@Enumeratedjavax.persistence枚舉類型映射`value`:ORDINAL/STRING
@Lobjavax.persistence大對象映射 (Blob/Clob)配合 @Basic(fetch=LAZY)
@Formulaorg.hibernate.annotations衍生屬性 (SQL 片段計算)`value`:SQL 表達式

關聯映射註解

多對一 (@ManyToOne)

@ManyToOne(targetEntity = Hotel.class, fetch = FetchType.LAZY)
@JoinColumn(name = "hotel_no", nullable = false, foreignKey = @ForeignKey(name = "FK_ROOM_HOTEL"))
private Hotel hotel;
  • `targetEntity`:目標實體類 (集合泛型可推斷時可省略)
  • `fetch`:LAZY (默認) / EAGER
  • `@JoinColumn`:外鍵列定義,`name` 對應當前表列名,`referencedColumnName` 對應目標表主鍵列 (默認主鍵)

一對多 (@OneToMany)

@OneToMany(mappedBy = "hotel", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
@OrderBy("roomNo ASC")
private Set<Room> rooms = new HashSet<>();
  • `mappedBy`:**關鍵**,指定關聯維護端 (多方) 的屬性名,表明由多方維護外鍵
  • `cascade`:級聯操作 (PERSIST/MERGE/REMOVE/REFRESH/DETACH/ALL)
  • `orphanRemoval`:孤兒刪除,從集合移除即刪除實體
  • `@OrderBy`:集合排序

多對多 (@ManyToMany)

// 擁有端
@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinTable(
    name = "student_course",
    joinColumns = @JoinColumn(name = "student_id"),
    inverseJoinColumns = @JoinColumn(name = "course_id")
)
private Set<Course> courses = new HashSet<>();

// 反向端
@ManyToMany(mappedBy = "courses")
private Set<Student> students = new HashSet<>();
  • `@JoinTable`:定義中間表,`joinColumns` 持有端外鍵,`inverseJoinColumns` 反向端外鍵
  • 雙向關聯需一端 `mappedBy`,另一端維護中間表

一對一 (@OneToOne)

// 共享主鍵
@OneToOne
@PrimaryKeyJoinColumn
private UserProfile profile;

// 外鍵關聯
@OneToOne
@JoinColumn(name = "profile_id", unique = true)
private UserProfile profile;

繼承映射策略

策略註解表結構優缺點
單表@Inheritance(strategy=SINGLE_TABLE)
@DiscriminatorColumn(name="DTYPE")
@DiscriminatorValue("EMP")
一張表,含所有子類字段 + 判別列查詢快、修改鎖爭用、空列多
連表@Inheritance(strategy=JOINED)父表 + 子表各自表,主鍵關聯範式好、查詢需 Join、插入多表
每類一表@Inheritance(strategy=TABLE_PER_CLASS)每個具體類一張表,含繼承字段多態查詢需 Union、主鍵生成複雜

其他實用 Hibernate 專有註解

  • `@Where(clause = "status = 1")`:實體/集合級過濾條件,自動加載有效數據
  • `@BatchSize(size = 20)`:集合/實體批量抓取優化 N+1
  • `@Fetch(FetchMode.SUBSELECT)`:集合子查詢抓取
  • `@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)`:二級快取策略
  • `@Filter(name="activeFilter", condition="status=1")` + `@FilterDef`:動態過濾器
  • `@Parameter(name="hibernate.type", value="custom")`:自定義類型映射

最佳實踐檢查清單

  1. 優先使用 JPA 標準註解,僅在需要 Hibernate 特有功能時引入專有註解
  2. 實體類實現 `Serializable`,定義 `serialVersionUID`
  3. 集合屬性初始化 (`new HashSet<>()`),避免 NPE
  4. 雙向關聯**雙邊維護**:提供 `addRoom(Room)` / `removeRoom(Room)` 封裝方法
  5. 主鍵策略根據數據庫選擇:MySQL→IDENTITY、Oracle/PostgreSQL→SEQUENCE、分布式→UUID/TABLE
  6. 延遲加載為默認,按需開啟 EAGER 或使用 `@NamedEntityGraph`/`EntityGraph` 動態抓取
  7. 關聯映射務必指定 `@JoinColumn`/`@JoinTable`,依賴默認命名易導致 Schema 不一致

註解式映射將元數據與代碼共存,極大提升了開發效率與可維護性。熟練掌握 JPA 標準註解與 Hibernate 擴展註解的組合使用,是現代 Java 持久層開發的核心技能。

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