hibernate入门使用系列 3-- xml关系映射篇(中)
接上篇 hibernate入门使用系列 2-- xml关系映射篇(上)
上篇讲了1:1,那么这次继续讲1:n和n:1。
这次用到的例子是Father和child之间的关系。一个father可以有n个child,但是1个child只有一个father。这里只说生父。至于其他的继父、养父、干爹等等,不再范围之内。
好吧。还是同前面的一样。现建立实体模型如下:
?
?
根据模型创建数据库。sql脚本如下:
这里要说说 "set" 这个标签里面的内容。
"name"是Father里面的属性的名字。
"table"表示它对应的是数据库中的哪个表。
cascade="all" 表示所有的操作都级联操作。
"inverse"表示关系的维护由谁来执行。true表示不由自己执行,而有对应的另外一方执行。false则相反,表示由自己维护关系。这里设置成 true 是由原因的。如果说把它设置成为false,那么就由他来维护关系了。
这里得说一下inverse属性的问题。在one-to-many中,如果关系由one来维护,那么会很麻烦,性能也会很低。每次对many一方的一条记录进行增、删、改 时都会多一次update操作。原因很简单,因为关系的维护设置在了one这一方,所以对many的每一次操作,one这一方都要维护一次双方的关系。
这个就好像皇帝和老百姓的关系。试问,是来一个老百姓,皇帝就宣布他是我的子民,还是由老百姓直接选择做那个皇帝的子民更加有效率呢?呵呵。不知道这个例子大家有没有明白。关于inverse的更具体的说明,在javaeye上搜一下,就会发现有很多。这里推荐一篇,我认为讲得很明白的:主题:inverse。
"key" 中的 "column" 表示在table(这里的table是child)中, 跟Father关联的字段名称。这里是"father_id"。可以看看开始的sql脚本。
one-to-many 表示father和children的关系。class则表示是同哪个类是这种关系。
?
?Child.hbm.xml:
?这个里面主要就是多了一个many-to-one,表示child 和 father 的关系是"many-to-one"
?
测试代码如下:
One2ManyTest.java
?这里不得不再重申以下 one-to-many 中 inverse 关系的维护问题。 在one-to-many中,把inverse放到many中来维护是一个好的习惯。大家可以把上面的inverse改成false,看看会发生什么情况。
在inverse=true的时候,输出结果如下:
具体的出错原因是:违反了非空约束。
得修改sql脚本,把Child的建表脚本中的:
???????????????????? father_id varchar(32) not null, 修改成为:father_id varchar(32),
才能通过。这个时候输出的结果是:
我的程序中出现这个错误,是什么意思?请教一下
我用的是一对多关系映射,一的这方用的是List集合
若业务要求为单向关联,也就是说在child这边不再有father的引用, 这样一来两表间的关联关系只能由father类来维护了, 当然在<set name="children" table="child" cascade="all" >里的inverse默认为false的, 可这样做效率上是受影响的: 当加child集合时hibernate得去检查看哪个child与father的关系有改变, 而假若由child这边来维护的话,就不会有这样效率方面的问题.
可在child的配置里若没有对father的引用后,我们也就无从下手了,不能两全其美. 11 楼 流浪者A 2008-11-05 这个例子经常见到,很容易理解,很好的例子~ 12 楼 xiaojiit 2008-12-04 能不能写一个用DetachedCriteria进行查询的例子呢?谢谢了!