Hibernate中持久化類的訪問者有兩個:
1.Java應用程序
2.hibernate(何時調用get、set方法?)
Java應用程序不能訪問持久化類的private方法,而hibernate沒有這個限制,它可以訪問各種級別的方法。
基本數據類型和包裝類型
基本數據類型和包裝類型對應的hibernate映射類型相同.
<property name=“price” type=“double” column=“PRICE” />
基本類型可直接運算、無法表達null、數字類型的默認值為0。
包裝類默認值是null。當對於默認值有業務意義的時候需要使用包裝類。
Hibernate訪問持久化類屬性的策略
1.property默認值:表明hibernate通過getXXX和setXXX來訪問類屬性。推薦使用。提高域模型透明性。
2.field:hibernate通過java反射機制直接訪問類屬性。對於沒有javabean方法的屬性可設置該訪問策略。
<property name=“name” access=“field” />
除了設置property屬性的access為field和property之外還可以自定義訪問策略,需要創建實現net.sf.hibernate.property.PropertyAccessor接口的類.然後把類的完整名字
賦值給<property>元素的access屬性
在持久化類的方法中加入程序邏輯
class Customer{ ….. private String firstname ; private String lastname ; public String getName(){ return firstname + “ ” + lastname ; } public void setName(String name){ StringTokenizer t = new StringTokenizer(name); firstname = t.nextToken(); lastname = t.nextToken(); } }
在customer.hbm.xml文件中無需映射firstname和lastname屬性,而是映射name屬性。
<property name =“name” column=“NAME” />
盡管類中並沒有name屬性,由於hibernate不是直接訪問Name屬性,而是調用get、set方法,因此建立了Firstname、Lastname和表之間的聯系。
不管在類中是否存在name屬性,只要在Customer.hbm.xml文件中映射了name屬性,在hql語句中就能訪問他。
Session.find(“from customer as c where c.name=‘tom’”)
在customer類的setOrders()方法中加入程序邏輯。
public void setOrders(Set orders){ this.orders = orders ; calprice(); } Public calprice(){ …… setAvgPrice(avgprice); }
在setSex()方法中加入數據驗證邏輯
public void setSex(char sex){ if(sex != ‘M’ && sex != ‘F’){ throw new IllegalArgumentException(“Invalid sex”); } this.sex = sex; }
設置派生屬性
利用<property>元素的formula屬性,用來設置一個sql表達式,hibernate將根據它來計算出派生屬性的值。
<property name=“totalprice” formula=“(select sum(o.PRICE) from ORDERS o where o.CUSTOMER_ID=ID)” /> <property name=“unitprice” formula=“BASE_PRICE*QUANTITY” />
另一種方案:在映射文件中不映射屬性,在set方法中加入程序邏輯。
控制insert、update語句
映射屬性
作用
<property>
insert屬性
若為false,在insert語句中不包含該字段,該字段永遠不能被插入。默認值true。
<property>
update屬性
若為false,update語句不包含該字段,該字段永遠不能被更新。默認值為true。
<class>
mutable屬性
若為false,等價於所有的<property>元素的update屬性為false,整個實例不能被更新。默認為true。
<property>
dynamic-insert屬性
若為true,保存一個對象時,會生成動態insert語句,只有這個字段取值不為null才會把它包含到insert語句中。默認為false。
<property>
dynamic-update屬性
若為true,更新一個對象時,會生成動態update語句,只有這個字段取值不為null才會把它包含到update語句中。默認為false。
<class>
dynamic-insert屬性
若為true,等價於所有的<property>元素的dynamic-insert為true,保存一個對象時,動態生成insert語句,語句中僅包含取值不為null的字段。默認false。
<class>
dynamic-update屬性
若為true,等價於所有的<property>元素的dynamic-update為true,更新一個對象時,動態生成update語句,語句中僅包含取值不為null的字段。默認false。
處理sql引用標識符 在SQL語法中,標識符是指用於為數據庫表、視圖、字段或索引等命名的字符串,常規標識符不包括空格,也不包含特殊字符,因此無需使用引用符號。如果數據庫表名或列名包含特殊字符,可以使用引用標識符。<property name=“description” column=“`CUSTOMER DESCRIPTION`” />
設置類的包名 如果在一個映射文件中包含多個類,並且這些類位於同一個包中,可以設置<hibernate-mapping>元素的package屬性,避免為每個類提供完整的類名。