hibernate一对多&多对多关系的操作(四)
程序员文章站
2022-03-22 18:43:44
一 数据库表与表之间的关系 总共有一对多关系、多对多关系和一对一关系三种一对多建表原则:在多的一方添加外键,指向1的一方多对多建表原则:必须通过中间表一对一建表原则:可以是建成一张表的(了解) 二 hibernate一对多关联映射 (一)1.准备工作:创建Java project,导入需要的jar包 ......
一 数据库表与表之间的关系
总共有一对多关系、多对多关系和一对一关系三种
一对多建表原则:在多的一方添加外键,指向1的一方
多对多建表原则:必须通过中间表
一对一建表原则:可以是建成一张表的(了解)
二 hibernate一对多关联映射
(一)1.准备工作:创建java project,导入需要的jar包,在数据库中创建客户和联系人的表(客户是一的一方,联系人是多的一方)
导入工具类
2.创建customer实体类,提供get/set方法(这里由于空间问题省略了)
public class customer { //这是一的一方 private long cust_id; private string cust_name; private string cust_source; private string cust_industry; private string cust_level; private string cust_phone; private string cust_mobile; private set<linkman> sets=new hashset<linkman>(); }
创建linkman实体类
public class linkman { private long lkm_id; private string lkm_name; private string lkm_gender; private string lkm_phone; private string lkm_mobile; private string lkm_email; private string lkm_qq; private string lkm_position; private string lkm_memo; private customer customer; }
3 customer的一的一方的配置文件
<?xml version="1.0" encoding="utf-8"?> <!doctype hibernate-mapping public "-//hibernate/hibernate mapping dtd 3.0//en" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <!--table是表名 --> <class name="com.itheima.domain.customer" table="cst_customer"> <id name="cust_id" column="cust_id" > <generator class="native"/> </id> <!-- 与普通字段建立对应关系 --> <property name="cust_name" column="cust_name"/> <property name="cust_source" column="cust_source"/> <property name="cust_industry" column="cust_industry"/> <property name="cust_level" column="cust_level"/> <property name="cust_phone" column="cust_phone"/> <property name="cust_mobile" column="cust_mobile"/> <set name="sets" cascade="save-update,delete" inverse="true" > <key column="lkm_cust_id"/> <one-to-many class="com.itheima.domain.linkman"/> </set> </class> </hibernate-mapping>
多的一方linkman的映射文件
<?xml version="1.0" encoding="utf-8"?> <!doctype hibernate-mapping public "-//hibernate/hibernate mapping dtd 3.0//en" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.itheima.domain.linkman" table="cst_linkman"> <id name="lkm_id" column="lkm_id"> <generator class="native"/> </id> <property name="lkm_name"/> <property name="lkm_gender"/> <property name="lkm_phone"/> <property name="lkm_mobile"/> <property name="lkm_email"/> <property name="lkm_qq"/> <property name="lkm_position"/> <property name="lkm_memo"/> <!-- 这是多的一方,many打头 --> <!-- 这里面是三个参数 --> <many-to-one name="customer" cascade="save-update" class="com.itheima.domain.customer" column="lkm_cust_id"/> </class> </hibernate-mapping>
4 创建核心配置文件
5编写测试类
@test public void testdemo1(){ session session = hibernateutils.getcurrentsession(); transaction ts = session.begintransaction(); //两个客户,三个联系人 customer customer1=new customer(); customer1.setcust_name("张三"); customer customer2=new customer(); customer2.setcust_name("李四"); linkman linkman1=new linkman(); linkman1.setlkm_name("小红"); linkman linkman2=new linkman(); linkman2.setlkm_name("小花"); linkman linkman3=new linkman(); linkman3.setlkm_name("小绿"); //设置关系 linkman1.setcustomer(customer1); linkman2.setcustomer(customer1); linkman3.setcustomer(customer2); customer1.getsets().add(linkman1); customer1.getsets().add(linkman2); customer2.getsets().add(linkman3); session.save(linkman1); session.save(linkman2); session.save(linkman3); session.save(customer1); session.save(customer2); ts.commit(); }
成功图:成功插入两个客户,三个联系人
中间遇到的问题:当时只保存了customer客户,没有保存联系人,报了瞬时对象异常
(二)一对多的级联操作
什么叫级联
级联指的是操作一个对象的时候是否会同时操作其关联的对象
级联是有方向性的
保存客户级联联系人
<set name="sets" cascade="save-update" >
@test /** * 保存客户级联联系人,操作的主体是客户 */ public void demo2(){ session session = hibernateutils.getcurrentsession(); transaction ts = session.begintransaction(); customer customer=new customer(); customer.setcust_name("大鸿"); linkman man=new linkman(); man.setlkm_name("张三"); man.setcustomer(customer); customer.getsets().add(man); session.save(customer); ts.commit(); }
操作成功图
(三)级联删除
@test /** * 级联删除 * 删除客户,同时删除联系人,操作的客户主体是客户,更改xml中的配置 * <set name="sets" cascade="delete" > * */ public void demo5(){ session session = hibernateutils.getcurrentsession(); transaction ts = session.begintransaction(); customer customer = session.get(customer.class, 1l); session.delete(customer); ts.commit(); }
xml中的配置
<set name="sets" cascade="delete" >
结果:把一号客户删除,同时删除1号对应的联系人。
三 hibernate多对多关联映射
(一)1.创建实体类user
public class user { private long user_id; private string user_code; private string user_name; private string user_password; private string user_state; private set<role> roles=new hashset<role>(); }
创建实体类role
public class role { private long role_id; private string role_name; private string role_memo; private set<user> users =new hashset<user>(); }
2 创建user实体的映射
<?xml version="1.0" encoding="utf-8"?> <!doctype hibernate-mapping public "-//hibernate/hibernate mapping dtd 3.0//en" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.itheima.domain.user" table="sys_user"> <id name="user_id" column="user_id"> <!-- 主键生成策略 --> <generator class="native"/> </id> <property name="user_code"/> <property name="user_name"/> <property name="user_password"/> <property name="user_state"/> <set name="roles" table="sys_user_role" cascade="save-update,delete" > <key column="user_id"/> <many-to-many class="com.itheima.domain.role" column="role_id" /> </set> </class> </hibernate-mapping>
创建role实体的映射
<?xml version="1.0" encoding="utf-8"?> <!doctype hibernate-mapping public "-//hibernate/hibernate mapping dtd 3.0//en" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.itheima.domain.role" table="sys_role"> <id name="role_id" column="role_id"> <generator class="native"/> </id> <property name="role_name"/> <property name="role_memo"/> <set name="users" table="sys_user_role" inverse="true" > <key column="role_id"/> <many-to-many class="com.itheima.domain.user" column="user_id" /> </set> </class> </hibernate-mapping>
3创建核心配置文件,注意引入映射文件
4创建测试类,保存用户级联角色,在user 的映射文件中配置cascade="save-update"
@test /** * 保存用户级联角色,操作的主体是用户 */ public void dmeo2() { //两个用户,三个角色 session session=hibernateutils.getcurrentsession(); transaction ts=session.begintransaction(); user user1=new user(); user1.setuser_name("王六"); role role1=new role(); role1.setrole_name("公关部"); user1.getroles().add(role1); role1.getusers().add(user1); session.save(user1); ts.commit(); }
成功图:user表 role表 中间表
(二)给用户添加一个角色
@test public void demo4(){ session session=hibernateutils.getcurrentsession(); transaction ts=session.begintransaction(); //给四号用户添加一个12号的角色 //先获得四号用户 user user=session.get(user.class, 4l); role role=session.get(role.class, 12l); //获得所有的角色,再新添加一个 user.getroles().add(role); ts.commit(); }
(三)给用户更改一个角色
@test public void demo5(){ //给用户改选角色,将原来的10号角色改为11号角色 session session=hibernateutils.getcurrentsession(); transaction ts=session.begintransaction(); //先获得四号用户 user user=session.get(user.class, 4l); role role10=session.get(role.class, 10l); role role11=session.get(role.class, 11l); user.getroles().remove(role10); user.getroles().add(role11); ts.commit(); }