ITEEDU

Hibernate Gossip: 动态模型(Dynamic Model)

在构造系统原型(Prototype)阶段时,由于需求尚未确定,应用程序模型中的Java对象会有相当大的变动,在Hibernate 3中引入了动态模式,可以使用对象容器充当Java对象,在构造系统原型时灵活变化,而不必实际定义Java对象。

假设您建立了以下的表格:
CREATE TABLE user (
    id INT(11) NOT NULL auto_increment PRIMARY KEY,
    name VARCHAR(100) NOT NULL default '',
    age INT
);
使用动态模式来作映像时,无需定义Java对象,直接在映像文件的<class>卷标上使用entity-name属性:
User.hbm.xml
<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
<class entity-name="onlyfun.caterpillar.DynamicUserModel"
table="user">

<id name="id" column="id" type="java.lang.Integer">
<generator class="native"/>
</id>

<property name="name"
column="name"
type="java.lang.String"/>

<property name="age"
column="age"
type="java.lang.Integer"/>

</class>

</hibernate-mapping>

entity-name属性设定的名称将在储存或加载时使用,例如可以如下储存数据:
Map userMap = new HashMap();
userMap.put("name", "caterpillar");
userMap.put("age", new Integer(30));
        
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
session.save("onlyfun.caterpillar.DynamicUserModel", userMap);
tx.commit();        
session.close();
Map容器的key用来表示属性名称,而value用来表示储存之对象,它们将对应至数据表中的字段与值,上面的程序片段储存数据后,数据表内容如下:
mysql> select * from user;
+----+-------------+------+
| id    | name         | age  |
+----+-------------+------+
|  1    | caterpillar |   30 |
+----+-------------+------+
1 row in set (0.00 sec)


如果要加载数据,则一个范例如下所示:
Session session = sessionFactory.openSession();
Map userMap = (Map) session.load("onlyfun.caterpillar.DynamicUserModel", new Integer(1));
System.out.println(userMap.get("name"));
System.out.println(userMap.get("age"));
session.close();
Hibernate 3引入动态模型的目的,在于更灵活的构造原型系统,在系统架构与对象模式确定之后,仍是要设计专用的Java对象,以获得编译时期的型态检查等好处。