一 数据库表与表之间的关系
总共有一对多关系、多对多关系和一对一关系三种
一对多建表原则:在多的一方添加外键,指向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 sets=new hashset();
}
创建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的一的一方的配置文件
/p>
"-//hibernate/hibernate mapping dtd 3.0//en"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
多的一方linkman的映射文件
/p>
"-//hibernate/hibernate mapping dtd 3.0//en"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
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客户,没有保存联系人,报了瞬时对象异常
(二)一对多的级联操作
什么叫级联
级联指的是操作一个对象的时候是否会同时操作其关联的对象
级联是有方向性的
保存客户级联联系人
@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中的配置
*
*
*/
public void demo5(){
session session = hibernateutils.getcurrentsession();
transaction ts = session.begintransaction();
customer customer = session.get(customer.class, 1l);
session.delete(customer);
ts.commit();
}
xml中的配置
结果:把一号客户删除,同时删除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 roles=new hashset();
}
创建实体类role
public class role {
private long role_id;
private string role_name;
private string role_memo;
private set users =new hashset();
}
2 创建user实体的映射
/p>
"-//hibernate/hibernate mapping dtd 3.0//en"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
创建role实体的映射
/p>
"-//hibernate/hibernate mapping dtd 3.0//en"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
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();
}
如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!