標籤:style blog http io os ar 使用 java sp
項目用的是SSH基礎架構,其中有一些資訊很類似,但又不盡相同。如果每一個建一個實體的話,那樣實體會太多,如果分組抽象,然後繼承,又不是特別有規律。鑒於這種情況,就打算讓使用者自己配置要添加的欄位,然後產生對應的表。
需要動態配置的部分執行個體:
只是一小部分,一個一個組合起來大概有三百多。每一項對應一個實體,顯然不好,就算是按照規律歸歸類還是有不少,於是就想到了在運行期來確定這些東西。開始有嘗試過動態編譯產生實體類,後來發現在資料存取上都存在問題,因為是後來產生的,所以只能用反射來擷取,這樣一來無法事先確定類型,也就沒法用注入的方式接收前端傳過來的資料,也不能向前端提供資料了。後來決定用Hibernate的動態模型來處理這個問題,可能有的人不是很瞭解Hibernate的動態模型,下面我們就來介紹一下。
我們通常用實體類來跟表進行映射,當我們需要一個user表的時候,通常都需要寫一個類似下面的實體類:
public class User {private Long id;private String name;private String password;// setter、getter...}
然後用設定檔或註解來描述映射關係,如果使用動態模型的話,則不需要編寫實體類,只需要寫一個設定檔即可:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping><!-- 此處不需要類名,和包名 --> <class entity-name="User"><id name="id" type="java.lang.Long" column="ID"><generator class="native"/></id><property name="name" type="java.lang.String" column="name"/><property name="password" type="java.lang.String" column="password"/></class></hibernate-mapping>
然後通過Map進行操作:
session.beginTransaction();//通過Map映射實體與資料庫Map user = new HashMap();user.put("name", "動態模型");user.put("password", "123456");session.save("User", user);session.getTransaction().commit();session.close();
發出的SQL語句:insert into User (name, password) values (?, ?)
有人說動態映射存入資料很方便, 但是從資料取出資料好像比較難處理,其實這個問題可以通過事先做好約定來解決。
上一篇部落格介紹了JRebel,它可以讓Tomcat支援熱部署。JRebel+Hibernate動態模型雙劍合璧,就可以實現我們動態建表的要求了。
在Spring的設定檔中加入:
<property name="mappingLocations"> <list> <value>classpath:/com/tgb/entitycfg/*.hbm.xml</value> </list> </property>
採用萬用字元來配置hbm.xml檔案,就是為了相容運行期產生的動態模型設定檔,而JRebel可以檢測到設定檔的變化,從而將新增的配置載入進來,需要說明的是JRebel的動態載入屬於懶載入,即在你用到修改的東西是,才會將你修改的內容重新載入進來。
我也是初次使用Hibernate動態模型,目前也算是嘗試階段吧,如果各位誰用過或者對動態模型感興趣歡迎留言交流。
菜鳥學SSH(十七)——Hibernate動態模型+JRebel實現動態建立表