Hibernate4实战 之 第四部分:关系映射(三)

2014-11-24 08:26:58 · 作者: · 浏览: 6
"
18. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
19.
20.
21.
22.
23.

24.
25.
26.
27.
28.

29.

30.

31.
32. Child.hbm.xml:
33. < xml version="1.0" encoding="UTF-8" >
34. 35. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
36. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
37.
38.
39.
40.
41.

42.
43.
44. 45. name="parent"
46. column="tbl_Parent_fk"
47. class="cn.javass.h3.parentchild.Parent"
48. not-null="true"
49. />
50.

51.

客户端测试TestMR.java文件太长,直接看演示好了。
在这个测试里面分别演示了单独的操作和级联的操作。
inverse:指定由哪一方来维护双方的关联关系,默认是false,也就是双方都维护,主要用在一对多 和 多对多中。
在一对多中使用inverse的时候,通常是在”一”这一端设置inverse=true,他的意思就是由多的那一端去维护关系,非反向端用于把内存中的表示保存到数据库中。如下:
Parent p = new Parent();
Child c = new Child();
c.setParent(p); //维护父子之间关系
p.getChildren().add(c);
ninverse还有一个重要特点就是会优化Sql
ncascade:定义对象的级联关系
all : 所有情况下均进行关联操作
none:所有情况下均不进行关联操作。这是默认值
save-update:在执行save/update/saveOrUpdate时进行关联操作
delete:在执行delete时进行关联操作
简单的示范一下双向的一对一
双向一对一的操作是类似于双向一对多的,只是配置上有一些不同:
1:Parent里面的配置,示例如下:
这里的property-ref参照的是Child对象里面的属性。
2:Child里面的配置,不是使用one-to-one,而是仍使用many-to-one,示例如下:

3:测试程序里面,原来调用集合的地方,变成调用一个Child对象,其他就差不多了,可以测试看看。

Hibernate4的过滤器
Hibernate3 新增了对某个类或者集合使用预先定义的过滤器条件(filter criteria)的功能。过滤器条件相当于定义一个 非常类似于类和各种集合上的“where”属性的约束子句, 但是过滤器条件可以带参数,应用程序可以在运行时决 定是否启用给定的过滤器,以及使用什么样的参数值。过滤器的用法很像数据库视图,只不过是在应用程序中确定使用什么样的参数的。

定义过滤器
要使用过滤器,首先要在相应的映射节点中定义。而定义一个过滤器,要用到位于 节点之内的 节点:
示例如下:

java代码:
1.
2.
3.


使用过滤器之配置
定义好之后,就可以在某个类中使用这个过滤器:

java代码:
1.
2. ...
3.
4.

或者也可以在某个集合使用它:

java代码:
1.
2.
3.


在同时可以使用多个过滤器。
使用过滤器之程序
在程序中,需要使用session接口中的:enableFilter(String filterName),getEnabledFilter(String filterName),和 disableFilter(String filterName)方法。Session中默认不启用过滤器,必须通过enabledFilter() 方法显式的启用。
示例代码session.enableFilter("myFilter").setParameter("myFilterParam", "some-value");
过滤器示例
在Parent.hbm.xml中定义有如下的过滤器:

java代码:
1.
2.
3.

4.
5.
6.
7.

在定义Child集合中使用

java代码:
1.
2.
3.
4. 5. condition="address like :myFilterParam">
6.
7.

程序中使用示例

java代码:
1. s.enableFilter("myFilter").setParameter("myFilterParam", "%1%");
2. s.enableFilter("myFilter2").setParameter("myFilterParam", 1)
3. .setParameter("myFilterParam2", 3);
4. Query q = s.createQuery("select p from Parent as p ");
5. System.out.println("p==="+p.getChildren());
6.

作者 :jinnianshilongnian