hibernate学习(2):多表设计及inverse和cascade属性的使用
2017-04-15 15:27
549 查看
前言
实际开发中往往将数据库设计成多表形式,关于多表的介绍请看本人博客:多表之间的关系。本文介绍hibernate中如何用面向对象语言来表示多表之间的关系,以及inverse和cascade属性的使用。正文
一,一对多(多对一)关系的表达需要在“一”的一方使用Set集合来存放“多”的一方的对象。且需要在“多”的一方引用“一”的一方的对象。比如“客户”和“订单”两张表。
由上图看出,hibernate中一对多的关系是由javabean中各自保有对方实例,以及在配置文件中相互引用来体现的。
下面介绍配置文件中“set”标签中的inverse和cascade属性。
1,inverse属性:意为“是否将维护关系的权利交给对方”,怎么理解呢?比如,我们实例化一个Customer对象,和两个Order对象。那么,双方都可以来维护关系:
a,coustomer来维护关系:customer1.getOrders().add(order1); customer1.getOrders().add(order2);
b,order来维护关系:order1.setCustomer(customer1); order2.setCustomer(customer1);
也就是说,双方都有维护关系的功能,然而,hibernate框架默认双方都维护关系,这样就产生了多余的update语句,可能使系统性能降低。于是就规定,通常让“一”的一方交出权利(即设置inverse=’true’),让“多”的一方来维护关系。这样,就能减少代码量,提升性能。
2,cascade属性:意为“级联操作”,就是在操作一方的同时,将引起的另一方操作也保存。如:只需要保存用户,那么跟用户相关的订单也保存。或者删除用户,跟用户有关的订单也一并删除。
级联操作有下面4种取值:
save-update:级联保存,级联修改. 保存A时,同时保存B.
(1)delete:删除A,同时删除B,AB都不存在
(2)delete-orphan:孤儿删除,解除关系,同时将B删除,A存在的。
如果需要配置多项,使用逗号分隔。
(3)all : save-update 和 delete 整合
(4)all-delete-orphan : 三个整合
下面是测试一对多的代码:
package com.jimmy.test; import org.hibernate.HibernateException; import org.hibernate.Session; import org.junit.Test; import com.jimmy.domain.Customer; import com.jimmy.domain.Order; import com.jimmy.utils.HibernateUtils; public class TestDemo2 { /** * 增 */ @Test public void test1(){ Session session = HibernateUtils.openSession(); try { session.beginTransaction(); //----------开启事务 Customer customer1 = new Customer(); customer1.setName("jimmy"); customer1.setGender("男"); Order order1 = new Order(); order1.setName("apple"); order1.setPrice(12.22); Order order2 = new Order(); order2.setName("banana"); order2.setPrice(23.22); customer1.getOrders().add(order1); customer1.getOrders().add(order2); session.save(customer1); //----------提交事务 session.getTransaction().commit(); //持久态 } catch (HibernateException e) { e.printStackTrace(); // transaction.rollback(); } finally{ session.close(); //游离态 } } /** * 删 */ @Test public void test2(){ Session session = HibernateUtils.openSession(); try { session.beginTransaction(); //----------开启事务 Customer cc = (Customer) session.get(Customer.class, 1); session.delete(cc); //----------提交事务 session.getTransaction().commit(); //持久态 } catch (HibernateException e) { e.printStackTrace(); // transaction.rollback(); } finally{ session.close(); //游离态 } } }
二,多对多关系的表达
多对多的表达,将每个类都用Set来引用对方的实例即可。比如学生和课程就是多对多的关系。
在mysql中,需要再建一张表来存双方的外键,在hibernate中就不必再创建该表的实体类啦,而是双方的“set”标签中增加“table”属性,使各方外键映射到该表。
同样也有inverse和cascade属性的使用。
下面是测试代码:
package com.jimmy.test; import org.hibernate.Transaction; import org.hibernate.classic.Session; import org.junit.Test; import com.jimmy.domain.Course; import com.jimmy.domain.Student; import com.jimmy.utils.HibernateUtils; public class TestDemo1 { @Test public void test1(){ Session session = HibernateUtils.openSession(); Transaction ts = null; try { ts = session.beginTransaction(); //---------------- Student student1 = new Student(); student1.setName("angela"); student1.setGender("女"); Course course1 = new Course(); course1.setName("yuwen"); course1.setScore(98); Course course2 = new Course(); course2.setName("shuxue"); course2.setScore(96); student1.getScores().add(course1); student1.getScores().add(course2); session.save(student1); //---------------- ts.commit(); } catch (Exception e) { ts.rollback(); } finally{ session.close(); } } }
总结
使用hibernate设计表,流程相对固定,多加练习为益。相关文章推荐
- [原创]java WEB学习笔记83:Hibernate学习之路---双向 1-n介绍,关键点解释,代码实现,set属性介绍(inverse,cascade ,order-by )
- 重新学习 Hibernate fetch lazy cascade inverse 关键字
- Hibernate中cascade与inverse属性详解(二)-Matrix
- Hibernate中的Inverse和cascade属性配置
- 学习 Hibernate fetch lazy cascade inverse 关键字
- 重点学习 Hibernate fetch lazy cascade inverse 关键字
- [*****] hibernate 中lazy、inverse、cascade属性
- Hibernate中的inverse属性和cascade属性
- Hibernate中cascade与inverse属性详解 ,很经典!!!
- Hibernate学习日志二--cascade和inverse分析
- 在hibernate中一对多关联时会经常用到inverse和cascade属性
- 搞定Hibernate表与表之间的关联,搞懂cascade、inverse、lazy等属性
- Hibernate 集合属性List 的使用----Hibernate 学习笔记总结(一)
- 重新学习 Hibernate fetch lazy cascade inverse 关键字
- 搞定Hibernate表与表之间的关联,搞懂cascade、inverse、lazy等属性
- 重新学习 Hibernate fetch lazy cascade inverse 关键字
- 重新学习 Hibernate fetch lazy cascade inverse 关键字
- Hibernate中cascade与inverse属性详解
- Hibernate中的Inverse和cascade属性配置
- Hibernate中的inverse属性和cascade属性