上一篇文章讲了Hibernate中的组件,将一个类中的几个相关属性用组件来表示,组件需要定义一个单独的类,比如上一篇文章中的名称组件,需要映射到Name.java类。Hibernate中还提供了动态组件,将组件映射到一个Map对象,用Map对象来保存组件的相关属性。对应的配置文件标签为。
我们将上一篇文章中的实例进行改写,用动态组件实现:
User类:
package com.metis.hibernate.domain; import java.util.Map; public class User2 { private String id; private Map name; private int age; public String getId() { return id; } public void setId(String id) { this.id = id; } public Map getName() { return name; } public void setName(Map name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
User.hbm.xml映射文件:
1.0"?> -//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <class name="com.metis.hibernate.domain.User2" table="USER"> id" type="java.lang.String"> ID" /> class="native" /> name"> firstName" column="FIRST_NAME" type="java.lang.String" /> middleName" column="MIDDLE_NAME" type="java.lang.String" /> lastName" column="LAST_NAME" type="java.lang.String" /> age" type="int"> AGE" /> class>
测试用例:
package com.metis.hibernate.test; import java.util.HashMap; import java.util.Map; import org.hibernate.Session; import com.metis.hibernate.domain.User2; import com.metis.hibernate.util.HibernateUtil; /** * 动态组件测试用例 * */ public class TestDaynamicComponent { public static void main(String[] args) { Session session = HibernateUtil.openSession(); session.beginTransaction(); Map name = new HashMap(); name.put("firstName", "李"); name.put("middleName", "世"); name.put("lastName", "民"); User2 user = new User2(); user.setName(name); user.setAge(12); session.save(user); session.getTransaction().commit(); HibernateUtil.closeSession(); } }
从映射的语义上来讲,它和是相同的。 这种映射类型的优点在于通过修改映射文件,就可以具有在部署时检测真实属性的能力.利用一个DOM解析器,是有可能在运行时刻操作映射文件的。 更好的是,你可以通过Configuration对象来访问(或者修改)Hibernate的运行时元模型。
源代码下载:点击下载