您的位置:首页 > 其它

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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: