posts - 0,  comments - 17,  trackbacks - 0
来源:http://www.tianxiaboke.com/u/lyeerwy

级联保存和更新
当Hibernate持久化一个临时对象时,在默认情下,他不会自动持久化所关联的其他临时对象,如果希望当持久化对象时把他所关联的所有临时对象进行持久化的话:可以把 的cascade属性设置为"save-update" ,cascade的默认属性值为none。
cascade:设置操作对象时的级联操作,即层级之间的连锁操作
值 save-update :表示当保存和更新当前对象(即insert和update语句时),会级联保存和更新与他关联的对象
值 all :表示任何情况下都会进行级联操作,即对一个对象进行操作,也会对和他关联的其他对象进行同样的操作
值 delete :表示在执行delete时,进行级联操作,删除和他关联的对象
值 none :表示任何情况下,都不会进行级联操作
<set>元素的inverse属性

在运行上面的程序时,如果hibernate的"show-sql"设置为true时,就会看到Hibernate会生成很多sql语句,其实很多sql语句都是重复的
eg: 
insert into  test.order(o_name,c_id)values(?,?)
insert into  test.order(o_name,c_id)values(?,?)
insert into  test order   set c_id=? where id=?
insert into  test order   set c_id=? where id=?

为了解决这个问题,我们可以利用在<set>标签中加上inverse属性。术语:inverse是指反转的意思,在Hibernate中,表示关联关系中的方向关联关系中,inverse="false"的主控方,由主动方负责维护对象关系我们 在customer对象的对象配置文件中加上

<set name="orders"  cascade="save-update" inverse="true">
<key  column="c_id" > </key>
<one-to-many class="net.mbs.mypack.Order " />
</set>

声明在Customer和Order的双向关联关系中,Customer端的关联只是Order端关联的镜象(即Order端是主空端,负责维护Customer和order对象之间的关联关系),当hibernate探测到持久化对象Customer或Order的状态发生变化时(主要是关联关系的改变),仅按照Order对象的状态的变化来同步更新数据库。
按次配置,如果在程序中,我们仅仅使用Customer.getOrder().add(order)(涉及了和Order的关联关系的改变),是不能让数据库跟对象的变化来进行数据库同步更新的,只有利用Order对象的方法改变的Order对象状态(eg:order.setCustomer(customer)----涉及到了和Customer的关联关系的改变)时,数据库才会根据变化来同步更新数据库,即只有主控方的状态(涉及到了和另一方面的关联关系的改变)发生了变化后,才会触发对象和数据库的同步更新。

映射一对多双向关联关系
当类与类之间建立了关联,就可以方便的从一个对象导航到另一个对象或一组与他关联的对象当中,根据上面的程序,对于一个给定的Order对象,如果想获取与他关联的Customer对象,我们只需要调用入下方法:
Customer c=order.geCustomer(); 那么当我们得到一个Customer对象后,想查出和这个Customer对象关联的所有Order对象时,应该怎么办呢?由于在Customer中没有建立对Order对象的关联,所以,不能通过加载Customer对象来自动加载和他关联的所有Order对象,唯一的方法只能通过JDBC或SQL语言人工写出代码来查询数据库Order表来返回所需要的信息
上面的问题虽然解决,但不能算是最好,因为这样性能会有所下降,对象位于内存中,在内存中从一个对象导航到另一个对象显然比到数据库中查询数据要快得多

具体实现<br>
1:由于Customer和Order是一对多,即一个Customer要对应多个Order,所以在Customer中应该建立一个Set对象,用于存放和本Customer对象关联的所有Order对象。
2:在customer.hbm.xml通过<one-to-many>建立对Order表的关联关系
注意:<one-to-many>应该放置在<set>标签中 
我们先来看看Customer类的设计和customer.hbm.xml文件的内容
<br><br><br>------------------------------------------------------
Customer Order 双向一对多
1:Customer类中建立一个容器对象,包含关联的所有Order对象
2:Order类中建立一个Customer对象,关联Customer
inverse="true"表示将维护关联的权利交给引起Hibernate语句的生成

customer.getOrders().add(order);
customer.setName("dddddd");

inverse="true"(设置此属性的一方----是被控方)
当主控方修改对象之间的关联关系时,让Hibernate生成sql语句

posted on 2008-03-15 23:56 xyz 阅读(8746) 评论(2)  编辑  收藏 所属分类: 网络文摘

FeedBack:
# re: Hibernate级联保存和更新
2008-03-15 23:57 | xyz
但是为什么级联插入数据库后,没有把外键也插入呢??  回复  更多评论
  
# re: Hibernate级联保存和更新[未登录]
2008-10-15 13:21 | x
不咋地  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 

<2024年5月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

留言簿

随笔档案(1)

文章分类(44)

文章档案(46)

收藏夹(1)

Adobe

AOP

API

appServer

BI

c

  • c-free
  • codeblocks
  • codelite
  • CodeLite IDE 是一个强大的开源,跨平台的 C/C++整合开发环境. 支持包括 Windows、Linux 和 Mac 系统下运行
  • codelite官网
  • dev-c++
  • Dev-C++是一个C&C++开发工具,它是一款自由软件,遵守GPL协议。
  • GCC
  • GCC 原名为 GNU C 语言编译器(GNU C Compiler),因为它原本只能处理 C语言。GCC 很快地扩展,变得可处理 C++。之后也变得可处理 Fortran、Pascal、Objective-C、Java, 以及 Ada 与其他语言。

Cache

CMS

DB

eclipse

FreeMarker

hibernate

html5

ibatis

java

jquery

js

json

Linux

Log

mail server

mobile

mysql

oauth

openID

other

PHP

portal

report

Scheduler

schema

Security

SOA

spring

struts

UI原型设计

w3c

Wap

webservice

xml

供应链管理

博客链接

好网站

工作流

开源网

招聘

插件下载

操作系统

构建可伸缩的系统

构建工具

测试

  • IETest
  • IE官网
  • OpenSTA
  • Siege
  • Siege是一个压力测试和评测工具,设计用于WEB开发这评估应用在压力下的承受能力

游戏

源码托管

经营

资源

金融/财务

搜索

  •  

最新评论