mysql配置多对多_数据库表关系及配置--多对多&一对多

1.数据库表中的关系

一对一

一对多(多对一)

多对多

2.如何确立和实现数据库中的表关系

一对多的表关系实现:

使用外键约束

我们习惯把一的方称为主表,把多的方称为从表

外键:从表中有一列,除了null之外,只能来源于主表的主键

默认情况下,外键的字段是可以重复的

多对多的表关系在数据库中实现:

使用中间表

中间表有两个外键,引用两个多对多表的主键

不能有其它字段信息,至于中间表的主键,应该采用联合主键

任何一个多方表和中间表去比较都是一对多的关系

一对一的表关系再数据库中实现:

有两种:

1.以建立外键的方式

使用外键约束,唯一约束,非空约束

他是把外键字段加上了非空和唯一约束,从而实现一对一

2.使用主键的方式

让其中一张表即是主键,又是外键。

3.多表映射配置要遵循的步骤

第一步:确定两张表之间的关系

第二步:在数据库中实现两张表之间的关系建立

第三步:在实体类中描述出两个实体之间的关系

第四步:在映射配置文件中简历两个实体和两个表之间的关系

4.一对多关系映射配置及操作

示例:人员表和角色表

第一步:确定两个表之间的关系

一个角色可以对应多个人员

role角色表是主表,person人员表是从表

第二步:在数据库表中简历联系

实现一对多关系,靠外键

person表中的r_id外键,是person的主键。

代码示例:

1.数据库表

c7cec2dfebaf7624ba52facdecf94974.png

5eedd83d7a944ecc61c658f3615a63a3.png

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();

}

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值