博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate学习笔记(一)
阅读量:4362 次
发布时间:2019-06-07

本文共 2781 字,大约阅读时间需要 9 分钟。

工作中用hibernate框架,但是呢一直只是粗略知道简单的CRUD,由于不太深入了解hibernate,工作上遇到很多莫名其妙的问题,所以买了一本孙卫琴的书补一下,写下一点琐碎的笔记做为记录,以免以后忘记了,温故而知新嘛。

 

问题一:

描述:Customer与Order一对多,建立双向关联,只记录关键,其他属性略去不写:

Customer配置文件中:

 

Order配置文件中:

1.如果Customer配置文件中去掉inverse="true"或设置inverse="false",以下代码报org.hibernate.TransientObjectException:

Session session = sessionFactory.openSession();session.beginTransaction();Customer cus = new Customer("cus1");Order order = new Order();order.setOrderNumber("orderNumber1");//order.setCustomer(cus);//不设置关联Order order2 = new Order();order2.setOrderNumber("orderNumber2");//order2.setCustomer(cus);//不设置关联cus.getOrders().add(order);cus.getOrders().add(order2);session.save(cus);session.getTransaction().commit();session.close();

 这是因为hibernate执行完insert以后还会执行更新,所以报上面的错:

Hibernate: insert into CUSTOMERS (NAME, ID) values (?, ?)
Hibernate: update ORDERS set CUSTOMER_ID=? where ID=?

2.如果设置inverse="true"则不会报错,这是因为session.save(cus);的时候将控制权反转给了对方即Order,不会产生update语句,这样的结果 是只产生一条Hibernate: insert into CUSTOMERS (NAME, ID) values (?, ?)。

3.如果修改Custom配置文件:

再次执行上面的代码,结果将是期望得到的,即产生三条insert插入三条记录,然后再产生两条update更新两个order对象的外键custom_id,总共产生五条sql。

 

综上其实我们可以总结出来:

如果One这方在set标签中设置inverse=false,custom这方关联多少条order,就会产生多少条update去更新order的外键,即update Order set custom_id = ? where id = ?;它的作用只是产生update语句,一般为了不产生这些多余的sql,一般都设置 为true

 

问题二:关于inverse与cascade:

custom:

order配置文件和上面相同

执行如下代码:

Session session = sessionFactory.openSession();Customer cus = (Customer) session.load(Customer.class, 1L);session.beginTransaction();session.delete(cus);session.getTransaction().commit();session.close();

上面的代码表达的意思无非就是级联删除,假设数据库有一条ID为1的Customer,两条关联的order,想实现将Customer和其两条关联的order都删除,上面的代码获得如期的效果:

Hibernate: delete from ORDERS where ID=?

Hibernate: delete from ORDERS where ID=?
Hibernate: delete from CUSTOMERS where ID=?

但是如果将上述inverse="true"去掉:产生sql如下:

Hibernate: update ORDERS set CUSTOMER_ID=null where CUSTOMER_ID=?

Hibernate: delete from ORDERS where ID=?
Hibernate: delete from ORDERS where ID=?
Hibernate: delete from CUSTOMERS where ID=?

它会先去维护两者的关系产生update语句,这时如果你的数据库中外键字段CUSTOMER_ID如果不允许为NULL,则会直接在update时直接产生一个异常,下面SQL不再执行。

 

由上可以得出:如果cascade与inverse都存在,先inverse再cascade,即先维护关联关系再删除。

 

上面的结论有个例外,那就是:

如果inverse="true" cascade="delete-orphan",执行下面代码:

Session session = sessionFactory.openSession();Customer cus = (Customer) session.load(Customer.class, 1L);session.beginTransaction();Iterator
it = cus.getOrders().iterator();it.next();it.remove();session.getTransaction().commit();session.close();

虽然inverse=true,不维护关联关系了,但还是会产生delete语句:

Hibernate: delete from ORDERS where ID=?

 

如果inverse="true" cascade="all",则上面代码不会删除order记录,不会删除记录。

 

 

 

 

转载于:https://www.cnblogs.com/yangguo/p/hibernate.html

你可能感兴趣的文章
httpclient新旧版本分割点4.3
查看>>
实现小数据量和海量数据的通用分页显示存储过程
查看>>
JPEG文件结构
查看>>
jquery api 笔记(2) 事件 事件对象
查看>>
10.17NOIP模拟赛
查看>>
Opus 和 AAC 声音编码格式
查看>>
探索Split函数第三位参数的用法
查看>>
应用程序无法启动,因为应用程序的并行配置不正确
查看>>
Python单元测试——unittest
查看>>
The document cannot be opened. It has been renamed, deleted or moved.
查看>>
ios中@class和 #import,两种方式的讨论
查看>>
OpenStack,ceph
查看>>
Odoo 8.0 new API 之Environment
查看>>
页面传值中get和post区别
查看>>
PHP-CGI漏洞成因原理剖析和利用
查看>>
20145212 罗天晨 《网络对抗》Exp3 Advanced 恶意代码伪装技术实践
查看>>
访问快科技(驱动之家)某个新闻会自动跳转到web.techtoutiao.win
查看>>
Cisco 的基本配置实例之四----vlan的规划及配置(核心交换机)
查看>>
Windows2003无法连接远程桌面问题 解决方法!
查看>>
解决 The word is not correctly spelled问题(转载)
查看>>