1、 Hibernate的開發流程
<1>、由Domain objectàmappingàdb。(官方推薦)
<2>、由DB開始,用工具生成mapping和 Domain object。(使用很多)
<3>、由映射文件開始。
2、 Domain Object限制
<1>、默認的構造方法(必須的)。
<2>、有無意義的標示符id(主鍵)(可選)。
<3>、非final的,對懶加載有影響(可選)。
例如:
publicclass User {
intid;
String name;
Date birthday;
getter/setter……
}
3、 Hibernate中持久化類需要遵循四條主要的規則(對第二條的補充)
<1>、爲屬性字段聲明setter和getter方法:Hibernate默認使用protected或private的get/set方法對,字段不需要聲明爲public。
<2>、實現一個默認的無參構造方法(constructor):所有的持久化類都必須有一個默認的構造方法(可以不是public),這樣Hibernate就可以使用Constructor.newInstance()來實例化它們了。
<3>、提供一個標識屬性(identifier property):該屬性映射數據庫表的主鍵字段。該屬性可以叫任何名字,其類型可以是任何原始類型、原始類型的包裝類型、String或者Date。標識符屬性是可選的。
<4>、使用非final的類:代理是Hibernate的一個重要的功能,它依賴的條件是,持久化類要麼是非final的,要麼實現一個所有方法都聲明爲public的接口。
4、 Hibernate映射文件就是用於說明java對象與哪個表中的記錄相對應,以及java對象中的各個屬性分別對應表中的哪一列,不同性質的屬性(例如,主鍵和普通屬性)用不同的標籤來映射,如果java對象中的某個屬性不需要存儲在數據庫中,那麼在Hibernate映射文件就不需要配置這個屬性!
5、 域模型的配置文件
<?xmlversion="1.0"?>
<hibernate-mapping
package="com.fei.hibernate.domain">
<classname="User" table=”user”>
<idname="id" column=”id”>
<generatorclass="native"/> //主鍵id是通過此標籤產生的
</id>
<propertyname="name"></property>
<propertyname="birthday"/>
</class>
</hibernate-mapping>
6、 大家也可以這麼簡單理解,由於Session可以管理多個數據庫表所對應的多個實體對象,如果要查詢id爲1的實體對象,Session.get()方法需要知道去從哪個數據庫表中查詢id爲1的記錄,所以,除了給get方法傳遞所要查詢的實體對象的id值外,還必須給get方法傳遞實體對象的類型,get方法才能知道去哪個數據庫表中進行查詢!
7、懶加載load()與get()的區別:
load()方法是在加載一個對象的時候自己產生了一個本類的子類對象,所以加載的對象不可能爲null,它是在第一次使用的時候纔會去訪問數據庫。
get()方法是在訪問時直接去數據庫取數據,不會產生代理對象。
8、 save()與persist()方法的區別:
save()方法是在沒有事務的時候,是先將數據插入數據庫再回滾刪除了數據;
persist()方法在沒有事務的時候,是不會將數據插入數據庫的(即不會產生insert語句),直接回滾刪除了數據。
但在有事務的時候,兩者的功能相同。
9、 evict方法和lock方法的用法:
evict方法可以將session中的某對象清除出session,如session.evict(emp)。
lock方法可以加上某種形式的鎖以便更新或讀寫,如session.lock(emp, LockMode.UPGRADE)。
merge()方法是將遊離對象變爲持久對象的方法