Hibernate中inverse、cascade的说明
2024-08-24 23:18:22
一: 前沿:刚刚学习hibernate时,对于inverse很是纠结,不知道什么时候该用什么时候不该用,在网上找了一些资料,说的也很含糊,我都不知道如果写了"inverse=true"时,到底是有谁来维护。下面我来说下自己的最终理解。
二:我那客户(Customer)和订单(Order)来说,一个客户有多个订单,一个订单属于一个客户。所以在学生的Order.hbm.xml中就是多对一的关系。在Customer中就是一对多。所以给出Customer中德配置如下:
<class name="com.shengsiyuan.hibernate.Customer" table="customers">
<id name="id" column="id" type="long">
<generator class="increment"></generator>
</id> <property name="name" type="string">
<column name="name" length=""></column>
</property> <!-- 这里的lazy设置为false,表示立即加载,而不是延迟加载 -->
这里把Customer。hbm.xml中的inverse设置为true表示客户与订单之间的关系由订单来维护,下面我会在测试类中会说明一些问题
<set name="orders" cascade="all" inverse="true" lazy="true">
<key column="customer_id"></key>
<one-to-many class="com.shengsiyuan.hibernate.Order"/> </set>
</class>
在Order.hbm.xml中德配置如下:
<class name="org.wh.hibernate.Order" table="orders">
<id name="id" column="id" type="long">
<generator class="increment"></generator>
</id> <property name="orderNumber" type="string">
<column name="order_Number" length="15"></column>
</property> <many-to-one name="customer" class="org.wh.hibernate.Customer" column="customer_id" lazy="false">
</many-to-one> </class>
在看HiberanteTest中德类的代码:
tx=session.beginTransaction(); Customer customer=new Customer(); customer.setName("zhangsan");
customer.setOrders(new HashSet()); Order order1=new Order();
order1.setOrderNumber("order1"); Order order2=new Order();
order2.setOrderNumber("order2"); Order order3=new Order();
order3.setOrderNumber("order3"); //由于是双向一对多的关系 //多到一
--------------如果在这里面没有添加以下三行代码,则会使order表中的外键为空值(null),因为在hbm.xml中我们是让订单表来维护客户和订单之间的关系,而在保存的时候保存的确是
--------------customer对象,所以要在代码中设置order和customer的关系。-------------------------如果把customer中德inverse去掉,即默认为false,那么就不需要加下面--------------几行代码,因为此时的关系是两方都在维护,所以在保存customer时会保存相应的order信息----------------------------------------------------------------------------不能将两边的配置中德inverse都同时设置为true,这样的结果是你让我来管,我要你来管,结果可想而知,。。。。。任何一方的操作都不会触发到对方表的信息
order1.setCustomer(customer);
order2.setCustomer(customer);
order3.setCustomer(customer); //一到多
customer.getOrders().add(order1);
customer.getOrders().add(order2);
customer.getOrders().add(order3); session.save(customer);
tx.commit();
三:在说cascade中德作用,cascade就是级联的意思,就是说在保存主对象时,相应的从属对象也要保存,删除主对象时,那么相应的从属对象也要被删除。就拿上述的Customer和Order两张表来说,在Customer.hbm.xml中德cascade=“all”,表示操作customer时,会保存相应的order信息,所以如果删除该customer,那么对应的Order表的信息也会删除。暂时我的理解就是这样,向cascade还有好几种属性,save-update等会再以后细作说明。
四:感悟:通过这几天的学习,觉得hibernate的配置还是很麻烦的,马上都快实习的,觉得时间不够用,而且最近对那些jquery,json都不是很理解,那种写法,好郁闷阿。OGBL自己还得在理解一边,每天还得去上课,真的好烦人啊。最近上extsj,老师一节课就把书给上完了,晕死。还是自己学吧。路漫漫啊。一步一个脚印吧。GO!Go!Go!,预祝自己学的好,并且找到一份好的实习工作吧。
最新文章
- &;#65279导致页面顶部空白一行解决方法 【】
- $是对string.Format的简化
- Chrome商店Crx离线安装包下载
- jquery 创建 SVG DOM 的处理方法
- SCADESuite嵌入式软件基于模型的开发
- Spring Tool Suit 在Eclipse上的安装
- 【LeetCode练习题】Swap Nodes in Pairs
- PIGS(最大流)
- [转]phpcms 判断用户登录代码
- java 容器、二叉树操作、107
- Mac系统的终端显示git当前分支
- 洛谷P3719 REXP 题解
- falcon常用参数解析
- [PHP]curl上传多文件
- 使用gulp进行代码压缩
- Groovy动态解析
- mybatis源码解析8---执行mapper接口方法到执行mapper.xml的sql的过程
- 计算字符串最后一个单词的长度,单词以空格隔开。 java算法
- django-response对象
- A1006. Sign In and Sign Out(25)
热门文章
- mysql用命令创建用户创建数据库设置权限
- 手把手教你写css3通用动画
- Qt 编译时遇到 error: [debug/qrc_music.cpp] Error 1
- CCF-NOIP-2018 提高组(复赛) 模拟试题(五)
- 数据挖掘算法:DBSCAN算法的C++实现
- Mac上利用Aria2加速百度网盘下载
- C#的Response.BinaryWrite图片乱码问题
- lintcode-84-落单的数 III
- TCP的挥手协议和握手协议2
- HTML5表单提交与PHP环境搭建