简介
Hibernate中持久化实体没有必要一定是POJO或者JavaBean对象。 Hibernate也支持动态模型进行持久化实体和数据库之间的映射。 官方文档(3.6)说“此功能正在试验中,也许会在未来版本中发生变化”,现在4.0也出了, 不知道是否发生了变化
动态模型就是完全抛弃了 Java 类的定义, 仅仅定义映射文件即可, 然后在程序中直接使用 Map 进行实体的操作(有一点像结构体那样额。。。)。
动态映射的好处(官方文档):数据变化所需要的时间少了,因为原型不需要实现实体类。你无法进行编译期的类型检查 ,并可能由此会处理很多的运行期异常。但是有了 Hibernate 映射,它使得数据库的 schema 能容易的规格化和合理化,并允许稍后在此之上添加合适的领域模型实现。
实例:
比如需要一个Person类
package chapter4.model; public class Person { private int id; private int age; private String name; // setter、getter省略 }
如果使用动态映射的话,就不需要再编写这个Person类, 只需要编写一个动态映射XML即可
<hibernate-mapping> <!-- 此处不需要类名,和包名 --> <class entity-name="PersonEntity" table="person_entity"> <id name="id" type="integer"> <generator class="native"/> </id> <property name="age" type="integer"/> <property name="name" type="string"/> </class> </hibernate-mapping>
然后在程序中直接使用Session进行通过Map进行实体操作:
SessionFactory sf = HibernateUtil.SF; Session session = sf.getCurrentSession(); session.beginTransaction(); // 通过Map映射实体与数据库 Map test = new HashMap(); test.put("age", new Integer(20)); test.put("name", "动态映射测试"); session.save("PersonEntity", test); // 运行结果: Hibernate: insert into PersonEntity (age, name) values (?, ?) session.getTransaction().commit(); session.close();
问题是通过动态映射存入数据方便了点, 但是从数据取出数据好像比较难以操作额。
不知道有没有人具体用过这个功能???