博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate之进阶2——表操作和多对多配置
阅读量:3939 次
发布时间:2019-05-23

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

一、数据库表与表之间的关系

1、一对多关系

1)一个部门对应多个员工、客户和联系人、商品和分类

2)建表原则

在多的一方创建外键,指向一的一方的主键

2、多对多关系

1)学生和课程、用户和角色

2)建表原则

创建一个中间表,中间表至少有两个字段分别作为指向多对多双方的主键

3、一对一关系

1)公司和注册地址

2)建表原则

唯一外键对应:模拟一对多关系,在多的一方创建外键约束,并加唯一约束;

主键对应:两个主键关联

二、Hibernate一对多关系配置

1、建表

根据一对多建表原则建表

2、实体类

1)在一的一方需要添加多的对象的集合

private Set
linkMan = new HashSet
();

2)在多的一方设置一的一方的对象属性

private Customer customer;

3、持久化类的映射配置

1)在一的一方配置

2)多的一方配置

4、核心配置文件的配置

需要将映射文件都放入核心配置中来

5、一对多的级联操作

正常未作其他配置的前提下,必须保存两个才可以进行执行,否则就会报瞬时对象异常

1)级联保存或更新

保存客户级联联系人:

在客户的映射中的set标签中加cascade属性,值为save-update,为了避免产生多余的sql语句,通常在一的一方的set中添加属性inverse=“true”,放弃外键维护

 

保存联系人级联客户@Test

​ /**

  • 级联保存——保存一的一方(保存客户,级联联系人)
    */
    public void demo2() {
    ​ Session session = HibernateUtils.getCurrentSession();
    ​ Transaction transaction = session.beginTransaction();
Customer customer = new Customer();	customer.setCust_name("客户1");		LinkMan linkMan = new LinkMan();	linkMan.setLkm_name("联系人1");		customer.getLinkMan().add(linkMan);	linkMan.setCustomer(customer);		session.save(customer);		transaction.commit();}

在联系人的配置文件中cascade

*通过级联操作可以测试对象的导航,判断发送几条sql语句

6、级联删除

在JDBC或者数据库中,有主外键关系的数据表,要先删除从表,再删除主表,在hibernate中科技设置级联删除,删除某一方就可以将级联的也删除掉

1)删除客户级联删除联系人

在客户的配置文件的set中的cascade中新加值delete

7、cascade和inverse区别

cascade是级联操作设置

inverse是维护外键的设置

8、测试对象的导航

@Test	/**	 * 测试对象的导航	 * 前提:在两边均设置了:cascade="save-update"	 */	public void demo4() {
Session session = HibernateUtils.getCurrentSession(); Transaction transaction = session.beginTransaction(); Customer customer = new Customer(); customer.setCust_name("客户1"); LinkMan linkMan1 = new LinkMan(); linkMan1.setLkm_name("联系人1"); LinkMan linkMan2 = new LinkMan(); linkMan2.setLkm_name("联系人2"); LinkMan linkMan3 = new LinkMan(); linkMan3.setLkm_name("联系人3"); linkMan1.setCustomer(customer); customer.getLinkMan().add(linkMan2); customer.getLinkMan().add(linkMan3); // session.save(linkMan1);//发送4条insert语句// session.save(customer);//发送3条insert语句 session.save(linkMan2);//发送1条insert语句 transaction.commit(); }

三、Hibernate的多对多关系映射

1、建表

多对多关系一定要建立中间表

2、创建实体

在两边的实体中都要添加另一方的set集合作为一个属性

3、创建映射

4、多对多的级联保存或更新

同样未设置级联操作的时候只保存一方是会抛异常的,注意多对多关系,一定要有一方放弃外键维护,通常是被动方放弃外键维护,这里可以是角色方放弃外键维护inverse=“true”

1)保存用户级联保存角色

在用户的一方的映射文件中配置set的一个cascade属性,值是sava-update

并将逐渐交给该类维护

@Test	/**	 * 设置了级联关系的,仅保存用户就可以级联保存角色	 */	public void demo2() {
Session session = HibernateUtils.getCurrentSession(); Transaction transaction = session.beginTransaction(); //创建一个用户 User user = new User(); user.setUser_name("用户1"); //创建一个角色 Role role = new Role(); role.setRole_name("角色1"); //设置双向关联关系 user.getRoles().add(role); role.getUsers().add(user); //保存用户即可级联保存用户对应的角色 session.save(user); //提交 transaction.commit(); }

2)保存角色激烈保存用户

在角色的映射中的set加cascade属性,并且维护外键

5、多对多级联删除(基本用不上)

6、给用户选择角色

}	@Test	/**	 * 给用户选择角色(为1号用户添加3号角色)	 */	public void demo5() {
Session session = HibernateUtils.getCurrentSession(); Transaction transaction = session.beginTransaction(); //查1号用户 User user = session.get(User.class, 1l); //查询3号角色 Role role = session.get(Role.class, 3l); //设置一号用户添加3号角色 user.getRoles().add(role); //提交 transaction.commit(); }

7、给用户改选角色

@Test	/**	 * 给用户改选角色(给2号用户选的2号角色改为1号角色	 */	public void demo6() {
Session session = HibernateUtils.getCurrentSession(); Transaction transaction = session.beginTransaction(); //查2号用户 User user = session.get(User.class, 2l); //查询2号角色 Role role2 = session.get(Role.class, 2l); //查询1号角色 Role role1 = session.get(Role.class, 1l); //先将2号用户的2号角色删除 user.getRoles().remove(role2); //再重新给二号用户添加1号角色 user.getRoles().add(role1); //提交 transaction.commit(); }

8、给用户删除角色

@Test	/**	 * 给用户删除角色(给2号用户删除1号角色)	 */	public void demo7() {
Session session = HibernateUtils.getCurrentSession(); Transaction transaction = session.beginTransaction(); //查2号用户 User user = session.get(User.class, 2l); //查询1号角色 Role role1 = session.get(Role.class, 1l); //先将2号用户的2号角色删除 user.getRoles().remove(role1); //提交 transaction.commit(); }

转载地址:http://lzbwi.baihongyu.com/

你可能感兴趣的文章
ubutun里面用命令行安装软件
查看>>
ubuntu 常用命令
查看>>
SQLite Tutorial 4 : How to export SQLite file into CSV or Excel file
查看>>
Optimizate objective function in matrix
查看>>
Convert polygon faces to triangles or quadrangles
查看>>
read obj in matlab
查看>>
find out the neighbour matrix of a mesh
查看>>
Operators and special characters in matlab
查看>>
As-Conformal-As-Possible Surface Registration
查看>>
qmake Variable Reference
查看>>
Lesson 2 Gradient Desent
查看>>
find border vertex
查看>>
matlab sliced variable
查看>>
create symbolic array
查看>>
TAUCS库的编译(vs2010)
查看>>
color vector using in plotting example points and lines between corresponding vertices
查看>>
mex 里面调用matlab函数
查看>>
matlab中cuda编程中分配grid和block dimension的时候的注意事项
查看>>
GPU CUDA and MEX Programming
查看>>
arrayfun用法
查看>>