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

Hibernate 對象關係映射基礎:持久化類、訪問策略、派生屬性與 SQL 控制

     編輯:Java 綜合教學

Hibernate 對象關係映射基礎:持久化類、訪問策略、派生屬性與 SQL 控制

持久化類屬性訪問權限

Hibernate 可訪問任意可見性的 getter/setter(含 private),Java 應用程序僅能訪問 public。建議保持標準 JavaBean 規範(public getter/setter),提高領域模型透明度。

基本類型 vs 包裝類型映射選擇

類型運算null 表達默認值適用場景
基本類型直接支援不可表達0/false業務上必填、有默認語義
包裝類型需拆箱原生支援 nullnull業務上可選、null 有特定含義

映射配置相同:<property name="price" type="double" column="PRICE"/>

屬性訪問策略

  • property(默認):調用 getter/setter,推薦
  • field:反射直接訪問字段,適用無 getter/setter 場景
    <property name="name" access="field"/>
  • 自定義:實現 PropertyAccessor 接口,指定全限定類名

在 getter/setter 中封裝業務邏輯

派生屬性映射

類中無 name 字段,但通過 getName() 組合 firstName + lastName,映射文件只需:

<property name="name" column="NAME"/>

HQL 可直接查詢:from Customer c where c.name='tom'

業務邏輯封裝示例

public void setOrders(Set orders) {
    this.orders = orders;
    calcPrice(); // 觸發衍生計算
}
public void setSex(char sex) {
    if (sex != 'M' && sex != 'F') throw new IllegalArgumentException("Invalid sex");
    this.sex = sex;
}

派生屬性的兩種實現方式

  1. formula 屬性(SQL 表達式,查詢時計算)
    <property name="totalPrice" formula="(select sum(o.PRICE) from ORDERS o where o.CUSTOMER_ID=ID)"/>
  2. setter 中計算(持久化時計算,存入數據庫)

控制 INSERT/UPDATE 生成

屬性/元素作用默認值
<property> insertfalse 則 INSERT 不包含該列true
<property> updatefalse 則 UPDATE 不包含該列true
<class> mutablefalse 則整個實體不可更新true
<property> dynamic-inserttrue 則僅非 null 列進入 INSERTfalse
<property> dynamic-updatetrue 則僅非 null 列進入 UPDATEfalse
<class> dynamic-insert/update類級別控制所有屬性false

處理特殊標識符

列名含特殊字符/關鍵字時使用反引號:

<property name="description" column="`CUSTOMER DESCRIPTION`"/>

包名簡化配置

同包多類映射文件可設置 <hibernate-mapping package="com.example.model">,避免重複寫全限定類名。

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