hibernate映射详解之: 对象 - 关系映射
2007-09-04 15:43
281 查看
Hiberante映射详解
4.1 首先问一下自己Hiberante是干什么的? 你真的确定知道吗?
Hiberante是一种ORM。(什么是ORM,ORM主要解决对象关系的映射问题。)“O”即对象,这里我认为是(一个或多个)实体;“R”即关系数据表。“M”即,描述了O和R之间的映射关系。具体什么是ORM,请自行google。Hibernate定义了怎样去实现ORM的一个解决方案,也叫中间件。
其实Hibernate并不像一些人描述的那样难以理解,Hibernate定义了,比如怎么去映射对象和关系,怎么去映射关系的实体;等等。只要用心去体会,慢慢的就可以理解。但是Hibernate也绝不简单,它不像STRUTS那样,地球人都知道它是实现MVC的解决方案,有分发器什么的。Hibernate实现持久层技术的思想,还是非常先进的。
好了,从下面开始介绍Hibernate的一些主要实现方法。
4.2 Hibernate映射之: 对象 ---- 关系映射
本小节主要说明,Hibernate是怎么实现对象模型即持久化类和关系模型之间的映射。它们之间的映射主要分三种情况:
① 持久化类中没有相应的getXXX() ,setXXX()方法
② 关系表中的字段在持久化类中没有相应的属性
③ 持久化类的属性在关系表中没有相应的字段
首先,第一种情况:
持久化类使用JavaBean风格,为需要被访问的属性提供了get, set 方法。它们也称为持久化类的访问方法。通过设置get,set方法的访问级别可以实现对访问权限的设置。
在对象---关系映射文件中,property元素的access属性指定了Hibernate访问持久化类属性的方式。它有两个可选值:property(默认值)和field。access=property时,Hibernate通过相应的get,set 来访问相应的属性;当access=field时,Hibernate通过Java反射机制直接访问类的属性。
即,<property name=“age” column=“age” access=“property”>情况下,Hibernate通过持久化类的getAge(),setAge()访问age属性;
<property name=“age” column=“age” access=“field”>情况下,Hibernate直接访问持久化类的age属性。user.age;
然后,第二种情况:
很明显, name字段在对应的持久化类中没有user属性。怎么办?
虽然没有相应的属性,但是在持久化中依然可以写setName(),getName()方法。然后在方法中,用getFirsetname()和setLastname()。
最后,第三种情况:
这种情况和第上一种情况有些类似,不过我们还有另一种解决方法---通过formula属性,即:派生属性。如:<property name=“maxAge” formula=“(select max(age) from user where id=ID)”>,那么当Hibernate从数据库中查询User对象时,在select 语句中会包含以上派生属性的子查询。
总结一下以上三种情况的解决方法:①通过access的field属性; ②虽然没有这个属性但依然用set,get方法;③通过formula属性;
4.3 Hibernate的 insert 和 update的控制方式
Hibernate在初始化阶段,就会根据映射文件的信息,为所有的持久化类预定义以下SQL语句:insert,update,delete根据OID查询持久化实例的select。 在默认情况下,预定义SQL中包含所有字段。但是,可以通过insert和update控制某个属性是否被包含在某些SQL中。如:<property name=“name” column=“name” access=“property” update=“false”> 这句配置信息表示:SQL语句不包含name字段。name永远不被更新。用于控制insert和update语句的映射属性:
映射属性 | 描 述 |
<property>的insert属性 | 默认为true; 如果为false,在insert中永不包含该字段 |
<property>的update属性 | 默认为true; 如果为false,在update中永不包含该字段 |
<class>的mutable属性 | 默认为true; 如果为false,等价于实例中所有字段的update属性都为faslse。整个实例都不能被更新 |
<property> 的dynamic-insert属性 | 默认为false; 如果为true,表示保存一个对象是,动态生成insert,只有这个字段不为null,才会把它包含到insert中 |
<property> 的dynamic-update属性 | 默认为false; 如果为true,表示更新一个对象是,动态生成update,只有这个字段的值变化,才会把它包含到update中 |
<class> 的dynamic-insert属性 | 默认为false; 如果为true,表示所有的property元素的insert属性都为true; |
<class> 的dynamic-update属性 | 默认为false; 如果为true,表示所有的property元素的update属性都为true; |
相关文章推荐
- Hibernate对象关系映射详解之“一对多”关系映射
- Hibernate之关系对象映射详解
- Hibernate对象关系映射----继承映射
- Hibernate学习2--对象的三种状态以及映射关系的简单配置
- 【HIbernate框架学习】:Hibernate对象关系映射之双向多对多关联映射
- 孙卫琴Hibernate第四章对象-关系映射基础
- 【HIbernate框架学习】:Hibernate对象关系映射之一对一关联映射(一)
- 【Java】Hibernate(四)对象/关系数据库映射基础
- Hibernate的核心对象关系映射
- Hibernate 双向 多 对 1 对象关系映射 下 ,测试 crud
- Hibernate之对象关系映射03一对一单向外键关联
- Hibernate的核心对象关系映射
- 【转】Hibernate之 对象/关系数据库映射基础(Basic O/R Mapping)
- Hibernate 学习笔记05 --对象关系映射
- Hibernate 关系映射配置inverse与cascade详解
- Hibernate两种实体关系映射详解
- Hibernate对象关系映射-- 多对多关联关系映射
- hibernate中List一对多映射关系详解
- 使用Hibernate进行对象的关系映射
- Hibernate入门BLOG[九、Hibernate对象关系多对一映射]