1.hibernate.cfg.xml Hibernate配置文件
可以使用XML或者是annotation配置持久類.
2. 使用XML配置持久類mapping
(1) User.hdb.xml
(2)UserIdCard.hbm.xml
(3) Address.hbm.xml
(4) Message.hbm.xml
3. POJO
Address.java
Message.java
User.java
UserIdCard.java
TestHibernate.java
4. 注意事項.
(1) User <-> UserIdCard 是OneToOne, XML配置lazy沒有lazy="true", annotation雖然fetch=FetchType.LAZY, 其實不生效的, load User對象的時候一般hibernate會主動load UserIdCard對象, 使用left outter join.
這裏使用的是公用主鍵, 使用外鍵配置文檔有例子(XML註釋部分)。
注意使用User user = (user) session.createQuery().uniqueResult(); 和session.load(User.class, "userIDxxx");生成的SQL, 注意調優, fetch join, outter join等.
Annotation配置的UserIdCard.user不寫lazy的話, load User by ID 默認會User left join UserIdCard left join User, 有點奇怪?
(2) User <-> Address OneToMany and ManyToOne, XML配<many-to-one lazy沒有true, 不配置lazy, load Address的時候不會去load User, annotation配置@ManyToOne的時候不加lazy的話會自動load User, 有點不一樣.
(3)<many-to-many> 和@ManyToMany就inverse="true"的一方不去維護關聯表UserMessage更新, 在這裏User.setMessages()之後session會更新UserMessage表, 但是Message.setUser()後不會更新. 雙向的關聯時候爲了避免一些表的鍵的衝突, 甚至是減少生成的SQL.
(4) Hibernate entity/annotation reference和hibernate reference有關於mapping的更詳細全面配置說明.
(5) 這裏都是雙向關聯, 根據應用設置關聯, lazy, fetch 方式.
(6) Hibernate是持久層的一種選擇方案, 符合關係型數據庫設計準則, 穩定成熟的一個方案, 能夠較好解決大多數問題 但是它存在緩存, 對於多個應用更新採訪同一服務器, 或者是 以爲數據庫爲中心的業務開發(使用存儲過程等) 應注意緩存屏蔽; 動態表, 對於現有一些系統(使用JDBC等)升級, 要謹慎設置使用.