1.数据库表中的关系
一对一
一对多(多对一)
多对多
2.如何确立和实现数据库中的表关系
一对多的表关系实现:
使用外键约束
我们习惯把一的方称为主表,把多的方称为从表
外键:从表中有一列,除了null之外,只能来源于主表的主键
默认情况下,外键的字段是可以重复的
多对多的表关系在数据库中实现:
使用中间表
中间表有两个外键,引用两个多对多表的主键
不能有其它字段信息,至于中间表的主键,应该采用联合主键
任何一个多方表和中间表去比较都是一对多的关系
一对一的表关系再数据库中实现:
有两种:
1.以建立外键的方式
使用外键约束,唯一约束,非空约束
他是把外键字段加上了非空和唯一约束,从而实现一对一
2.使用主键的方式
让其中一张表即是主键,又是外键。
3.多表映射配置要遵循的步骤
第一步:确定两张表之间的关系
第二步:在数据库中实现两张表之间的关系建立
第三步:在实体类中描述出两个实体之间的关系
第四步:在映射配置文件中简历两个实体和两个表之间的关系
4.一对多关系映射配置及操作
示例:人员表和角色表
第一步:确定两个表之间的关系
一个角色可以对应多个人员
role角色表是主表,person人员表是从表
第二步:在数据库表中简历联系
实现一对多关系,靠外键
person表中的r_id外键,是person的主键。
代码示例:
1.数据库表
2.hibernate.md.xml配置
/p>
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
com.mysql.jdbc.Driver
jdbc:mysql://127.0.0.1:3306/mybatis
root
root
true
update
thread
org.hibernate.connection.C3P0ConnectionProvider
3.person.hbm.xml
/p>
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
4.role.hbm.xml
/p>
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
5.实体类
public class Person implementsSerializable {privateInteger pId;privateString pName;privateString pAddress;//一对多关系映射,从表实体包含主表实体的对象引用
privateRole role;
}//省了get/set方法
public class Role implementsSerializable {privateInteger rId;privateString rName;//一对多关系映射,主表实体应该包含从表实体的集引用
private Setset;
}//省去get/set方法
6.测试类
public classTestHibernate01 {//查询Person
@Testpublic voidtest01() {
Session s=HibernateUtils.getCurrnetSession();
Transaction tx=s.beginTransaction();
Query query= s.createQuery("from Person ");
List list=query.list();for(Object o : list) {
Person person=(Person) o;
System.out.println(person.getpName()+ ":" +person.getRole().getrName());
}
tx.commit();
}//查询所有的Role
@Testpublic voidtest02() {
Session s=HibernateUtils.getCurrnetSession();
Transaction tx=s.beginTransaction();
Query query= s.createQuery("from Role");
List list=query.list();for(Object o : list) {
Role role=(Role) o;
System.out.println(role.getrName());for(Person person : role.getSet()) {
System.out.println("set:" +person.getpName());
}
}
tx.commit();
}//修改角色的操作保存操作
@Testpublic voidtest03() {
Session s=HibernateUtils.getCurrnetSession();
Transaction tx=s.beginTransaction();
Role o= (Role) s.get(Role.class, 1);
System.out.println("Role=" +o);
Person o1= (Person) s.get(Person.class, 2);
o1.setRole(o);
System.out.println("Person=" +o1);
s.update(o1);
tx.commit();
}//级联更新//set标签的属性cascade="save-update" 级联更新为true
@Testpublic voidtest04() {
Session s=HibernateUtils.getCurrnetSession();
Transaction tx=s.beginTransaction();
Role o= (Role) s.get(Role.class, 3);
o.setrName("大将");
System.out.println("Role=" +o.getrName());
s.save(o);
tx.commit();
}//级联删除//set标签 级联删除需要配置inverse="true" cascade="save-update,delete"(开发中一般慎用)
@Testpublic voidtest05() {
Session s=HibernateUtils.getCurrnetSession();
Transaction tx=s.beginTransaction();
Role o= (Role) s.get(Role.class, 3);
s.delete(o);
tx.commit();
}
}
5.多对多关系映射配置及操作
使用中间表
中间表有两个外键,引用两个多对多表的主键
需求:实现角色表和权限表之间的多对多,没个角色多个权限,每个权限对应多个角色
1.修改Role角色类和创建Astrict权限类
public class Role implementsSerializable {privateInteger rId;privateString rName;//一对多关系映射,主表实体应该包含从表实体的集引用
private Set set=new HashSet(0);private Set astricts=new HashSet(0);public SetgetAstricts() {returnastricts;
}public void setAstricts(Setastricts) {this.astricts =astricts;
}
@OverridepublicString toString() {return "Role{" +
"rId=" + rId +
", rName='" + rName + '\'' +
", set=" + set +
'}';
}public SetgetSet() {returnset;
}public void setSet(Setset) {this.set =set;
}publicInteger getrId() {returnrId;
}public voidsetrId(Integer rId) {this.rId =rId;
}publicString getrName() {returnrName;
}public voidsetrName(String rName) {this.rName =rName;
}
}
importjava.io.Serializable;importjava.util.HashSet;importjava.util.Set;public class Astrict implementsSerializable {privateInteger aId;privateString aName;privateString aType;public SetgetRoles() {returnroles;
}public void setRoles(Setroles) {this.roles =roles;
}private Set roles=new HashSet(0);publicString getaType() {returnaType;
}public voidsetaType(String aType) {this.aType =aType;
}publicInteger getaId() {returnaId;
}public voidsetaId(Integer aId) {this.aId =aId;
}publicString getaName() {returnaName;
}public voidsetaName(String aName) {this.aName =aName;
}
}
2.配置astrict.hbm.xml和role.hbm.xml文件
/p>
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
/p>
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
3.在主配置文件添加映射
4.测试
多对多保存,多对多全部查询,多对多添加查询
/**
* 多对多保存操作
* 需求:角色-主公的带兵,献计和封侯权限;军事-主公的带兵和献计权限;大将-主公的带兵
*/
@Test
public void test01() {
Session s = HibernateUtils.getCurrnetSession();
Transaction tx = s.beginTransaction();
Role r1 = (Role)s.get(Role.class, 1); //角色1 主公
Role r2 = (Role)s.get(Role.class, 2); //角色1 军师
Role r3 = (Role)s.get(Role.class, 3); //角色1 大将
Astrict a1=new Astrict();
a1.setaName("带兵");
Astrict a2=new Astrict();
a2.setaName("献计");
Astrict a3=new Astrict();
a3.setaName("封侯");
//建立双向联系
//1.先建立角色的
//主公 -- 带兵,献计,封侯
r1.getAstricts().add(a1);
r1.getAstricts().add(a2);
r1.getAstricts().add(a3);
//军师 -- 带兵,封侯
r2.getAstricts().add(a1);
r2.getAstricts().add(a2);
//大将 -- 带兵
r3.getAstricts().add(a1);
//2.在建立权限的
//带兵 -- 主公,军事,大将
a1.getRoles().add(r1);
a1.getRoles().add(r2);
a1.getRoles().add(r3);
//献计 -- 主公,军事
a2.getRoles().add(r1);
a2.getRoles().add(r2);
//封侯 -- 主公
a3.getRoles().add(r1);
s.update(r1);
s.update(r2);
s.update(r3);
s.save(a1);
s.save(a2);
s.save(a3);
tx.commit();
}
/**
* 多对多全部查询
* 同过获取属性的方法,直接查询p1.getRole().getAstricts()
*/
@Test
public void test02(){
Session s = HibernateUtils.getCurrnetSession();
Transaction tx = s.beginTransaction();
Query query=s.createQuery("from Person ");
List list = query.list();
for (Person person : list) {
System.out.println("姓名:"+person.getpName()+",角色:"+person.getRole().getrName());
Set set= person.getRole().getAstricts();
for (Astrict astrict : set) {
System.out.println(astrict.getaName());
}
}
tx.commit();
}
/**
* 多对多条件查询
* 同过获取属性的方法,直接查询p1.getRole().getAstricts()
*/
@Test
public void test03(){
Session s = HibernateUtils.getCurrnetSession();
Transaction tx = s.beginTransaction();
Person p1 = (Person)s.get(Person.class, 1);
System.out.println("姓名:"+p1.getpName()+",角色:"+p1.getRole().getrName());
Set set= p1.getRole().getAstricts();
for (Astrict astrict : set) {
System.out.println(astrict.getaName());
}
tx.commit();
}
}