Hibernate 對持久化對象的要求
1、提供一個無參的構造器,使Hibernate可以使用Constructor.newInstance()來實例化持久化類。
注意:在java的類中如果沒有指定構造函數,那麼會有一個默認的構造函數。如果手動定義了一個有參的構造函數,那麼此時默認的無參構造函數 將不存在,應該再定義一個無參構造函數。
2、提供一個標示屬性,通常映射爲數據庫表的主鍵字段。
3、爲持久化類的字段聲明get/set 方法
4、使用非final類,如果使用fianl類,會影響懶加載特性。
5、重寫equals()和hashCode()方法,如果需要把持久化類的實力放到set集合(當需要進行關聯映射時)中,則應該重寫這兩個方法。
一般每一個實體類對應一個*.hbm.xml文件。配置方法及屬性如下:
<hibernate-mapping>
<!--
name屬性:哪個類
table屬性:對應哪個表,如果不寫,默認的表名就是類的簡單名稱
-->
<class name="edu.fjnu.domain.User" table="t_user">
<id name="id" type="int" column="id">
<generator class="sequence">
<param name="sequence">SEQUENCE_ON_USER</param>
</generator>
</id>
<!--
普通屬性(數據庫中的基本類型,如字符串、日期、數字等)
name屬性:對象的屬性名,必須有
type屬性:類型,如果不寫,Hibernate會自動檢測
可以寫Java中類的全名
或是寫hibernate類型
column屬性:對應的表中的列名,如果沒有默認爲屬性名。
length屬性:長度,不是所有的類型都有長度屬性,比如vachar2有,但int沒有,
如果不寫默認爲255
not-null:非空約束,默認爲false
-->
<property name="name" type="string" column="name" length="20" not-null="true"/>
<property name="age" type="int" column="age"/>
<property name="birthday" type="date" column="birthday"/>
<!-- 當列名與關鍵字衝突時,可以通過column屬性指定一個其他的列名。
或是使用反引號包圍起來
指定使用text類型時,最好再指定length,以確定生成的SQL類型是能夠存放指定數量的字符的
-->
<property name="desc" type="text" length="5000" column="`desc`"/>
<!-- 圖片,二進制類型,最好指定長度 -->
<property name="photo" type="binary" length="102400"></property>
</class>
</hibernate-mapping>
映射主鍵屬性
第7行class中可以指定主鍵生成的策略:
1、identity:使用數據庫的自動增長策略,不是所有數據庫都支持,比如oracle就不支持
2、sequence:oracle中可以使用序列來讓主鍵自動增長
3、hilo:使用高地位算法來生成的主鍵值。只需要一張額外的表,所有的數據庫都支持
4、native:根據底層數據庫能力選擇identity、sequence、hilo中的一個。
5、increment:先查詢當前最大的id值,再加1使用,由hibernate維護的自動增長,有多線程下會有
6、assigned:手動指定一個主鍵值
7、uuid:由hibernate自動生成UUID並指定爲主鍵值
<hibernate-mapping package="edu.fjnu.hbm_id">
<class name="User" table="t_user">
<!-- id元素用戶映射主鍵
子元素generator是用於指定主鍵生成策略的
-->
<id name="id" type="int" column="id">
<generator class="assigned"/>
</id>
<property name="name" type="string" column="name" length="20" not-null="true"/>
</class>
</hibernate-mapping>