Hibernate動態(tài)模型(Dynamic models)詳解
本文向大家介紹Hibernate動態(tài)模型(Dynamic models),可能好多人還不了解Hibernate動態(tài)模型(Dynamic models),沒有關系,看完本文你肯定有不少收獲,希望本文能教會你更多東西。
Hibernate動態(tài)模型(Dynamic models)
注意:以下特性在當前處于試驗階段,將來可能會有變化。
運行期的持久化實體沒有必要一定表示為像POJO類或JavaBean對象那樣的形式。Hibernate也支持動態(tài)模型(在運行期使用Map的Map)和象DOM4J的樹模型那樣的實體表示。使用這種方法,你不用寫持久化類,只寫映射文件就行了。
Hibernate默認工作在普通POJO模式。你可以使用配置選項default_entity_mode, 對特定的SessionFactory,設置一個默認的實體表示模式。 (參見表 3.3 “ Hibernate配置屬性 ”。)
下面是用Map來表示的例子。首先,在映射文件中,要聲明 entity-name來代替一個類名(或作為一種附屬)。
- <hibernate-mapping>
 - <class entity-name="Customer">
 - <id name="id"
 - type="long"
 - column="ID">
 - <generator class="sequence"/>
 - </id>
 - <property name="name"
 - column="NAME"
 - type="string"/>
 - <property name="address"
 - column="ADDRESS"
 - type="string"/>
 - <many-to-one name="organization"
 - column="ORGANIZATION_ID"
 - class="Organization"/>
 - <bag name="orders"
 - inverse="true"
 - lazy="false"
 - cascade="all">
 - <key column="CUSTOMER_ID"/>
 - <one-to-many class="Order"/>
 - </bag>
 - </class>
 - </hibernate-mapping>
 
注意:雖然是用目標類名來聲明關聯的,但是關聯的目標類型除了是POJO之外,也可以 是一個動態(tài)的實體。
在使用dynamic-map為SessionFactory 設置了默認的實體模式之后,可以在運行期使用Map的 Map。
- Session s = openSession();
 - Transaction tx = s.beginTransaction();
 - Session s = openSession();
 - // Create a customer
 - Map david = new HashMap();
 - david.put("name", "David");
 - // Create an organization
 - Map foobar = new HashMap();
 - foobar.put("name", "Foobar Inc.");
 - // Link both
 - david.put("organization", foobar);
 - // Save both
 - s.save("Customer", david);
 - s.save("Organization", foobar);
 - tx.commit();
 - s.close();
 
動態(tài)映射的好處是,變化所需要的時間少了,因為原型不需要實現實體類。然而,你無法進行 編譯期的類型檢查,并可能由此會處理很多的運行期異常。幸虧有了Hibernate映射,它使得數 據庫的schema能容易的規(guī)格化和合理化,并允許稍后在此之上添加合適的領域模型實現。
實體表示模式也能在每個Session的基礎上設置:
- Session dynamicSession = pojoSession.getSession(EntityMode.MAP);
 - // Create a customer
 - Map david = new HashMap();
 - david.put("name", "David");
 - dynamicSession.save("Customer", david);
 - ...
 - dynamicSession.flush();
 - dynamicSession.close()
 - ...
 - // Continue on pojoSession
 
請注意:用EntityMode調用getSession()是在 Session的API中,而不是SessionFactory。 這樣,新的Session共享底層的JDBC連接,事務,和其他的上下文信 息。這意味著,你不需要在第二個Session中調用 flush()和close(),同樣的,把事務和連接的處理 交給原來的工作單元。
關于XML表示能力的更多信息在XML映射中找到,這里我們就不加以介紹了。 
【編輯推薦】















 
 
 



 
 
 
 