现在的位置: 首页 > 综合 > 正文

hibernate映射详解之: 对象 – 关系映射

2014年01月29日 ⁄ 综合 ⁄ 共 2189字 ⁄ 字号 评论关闭

Hiberante映射详解

4.1  首先问一下自己Hiberante是干什么的? 你真的确定知道吗?

Hiberante是一种ORM。(什么是ORMORM主要解决对象关系的映射问题。)“O”即对象,这里我认为是(一个或多个)实体;“R”即关系数据表。“M”即,描述了OR之间的映射关系。具体什么是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(默认值)fieldaccess=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 语句中会包含以上派生属性的子查询。

总结一下以上三种情况的解决方法:①通过accessfield属性; ②虽然没有这个属性但依然用set,get方法;③通过formula属性;

4.3 Hibernate  insert update的控制方式

Hibernate在初始化阶段,就会根据映射文件的信息,为所有的持久化类预定义以下SQL语句:insert,update,delete根据OID查询持久化实例的select。 在默认情况下,预定义SQL中包含所有字段。但是,可以通过insertupdate控制某个属性是否被包含在某些SQL中。如:<property name=name column=name access=property update=false> 这句配置信息表示:SQL语句不包含name字段。name永远不被更新。

用于控制insertupdate语句的映射属性:

映射属性

   

<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;

 

 

【上篇】
【下篇】

抱歉!评论已关闭.