首先回顾一下以前没有用框架,普通的一对多的关联映射的做法:
1.一对多关系,一:cst_customer表,多:cst_linkman表
在cst_linkman表中设置一个外键lkm_cust_id,然后把cst_linkman表中的外键lkm_cust_id和cst_customer表中的主键cust_id关联起来
至于怎么做关联》
第一种方法:
第二种方法:
https://blog.csdn.net/qq_37591637/article/details/84389021
原归正传,如果用的是hibernate,那么该怎么做?
mysql阶段
前提须知:
我要实现的是:
kind表是职位和说明,例如 经理 -负责部门工作
user表是编号、姓名,职务 例如 002-小田-经理
一个经理的职位可以有很多人,例如销售经理 部门经理等等
但是一个人的职位只能有一个,在公司里面
【这个例子虽然不适用所有的,但是纯属举例说明,杠精们难受的话,不往看】
用hibernate的好处就是,我不用自己在user表创建一个外键和kinds表关联
1、两张表user 和kind
2、kind表和user表是一对多的关系;
kind表的结构如下:
user表的结构如下:
(u_k是外键 需要把user表和kind表约束关联起来 这个是关键的一步)
怎么关联两张表:https://blog.csdn.net/qq_37591637/article/details/84389021
代码阶段
第一部分、创建实体类+配置相关的映射文件
前提:知道用hibernate操作数据库,增删改查
如果不知道用hibernate操作数据库,增删改查的话,请看这个资料,补一下知识,
映射文件配置:https://blog.csdn.net/qq_37591637/article/details/84337701
核心文件配置:https://blog.csdn.net/qq_37591637/article/details/84339503
这里需要注意的是:
kind表对应的是一;
user表对应的是多;
所以在User的实体类里面有 private Kinds kk;属性;
在Kinds的实体类里面有 private Set<User> uu=new HashSet<User>();多对应的就是集合属性
kinds.java
package cn.com.dao;
public class User {
/*
* 实体类的编写原则
* 1.属性私有
* 2.set get方法
* 3.有主键
* 4.类型用封装类 如不用int用Integer 不用char用Character
* 5.有无参的构造函数,方便数据库的rurd操作
*/
private String number;
private String name;
private Kinds kk;
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Kinds getKk() {
return kk;
}
public void setKk(Kinds kk) {
this.k_k = kk;
}
}
User.java
package cn.com.dao;
import java.util.HashSet;
import java.util.Set;
public class Kinds {
private String kinds;
private String discript;
private Set<User> uu=new HashSet<User>();
public String getKinds() {
return kinds;
}
public void setKinds(String kinds) {
this.kinds = kinds;
}
public String getDiscript() {
return discript;
}
public void setDiscript(String discript) {
this.discript = discript;
}
//多的一方用集合
public Set<User> getUu() {
return users;
}
public void setUu(Set<User> uu) {
this.uu = uu;
}
}
映射文件如下:
User.hbm.xml
注意:
1、这里面的name是在User实体类中 private Kinds kk;与kk同名
2、class是Kinds类的全路径
3、column是user表中外键的名称、不是kind表中外键的名称
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<!-- class是表名与类名的映射 name="实体类的包名+类名" table="表名称" catalog="数据库名称" -->
<class name="cn.com.dao.User" table="user" >
<!--设置主键的属性,每一个实体类都必须有主键 name="类中主键的名称" column="表中主键的名称" type="都是小写的java类型"
lenth="长度" -->
<id name="number" column="number" type="string" length="255">
<!-- 主键生成策略 以下是自增 -->
<generator class="assigned"></generator>
</id>
<!-- 其他非主键的普通属性 -->
<property name="name" column="name" type="string" length="255" />
<!-- 配置关联对象 -->
<!-- many-to-one标签:代表多对一
*name:一的一方的对象的名称 -->
<many-to-one name="kk" class="cn.com.dao.Kinds" column="u_k"/>
</class>
</hibernate-mapping>
这里有特别需要注意的一点:
Kinds.hbm.xml
注意;
1、<set name="集合的名称"> 与private Set<User> uu=new HashSet<User>();中uu一致
2、column="u_k" column="多的一方的外键" user是多的一方,外键是u_k
注意两张映射文件的column="都是多的一方的外键" 都是一致的,无论是kinds还是user的映射文件,column="多的一方的外键"
3、class="多的一方的实体类的全路径"
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<class name="cn.com.dao.Kinds" table="kinds" >
<id name="kinds" column="kinds" type="string" length="255">
<generator class="assigned"></generator>
</id>
<property name="discript" column="discript" type="string" length="255"/>
<!--配置关联对象 -->
<!-- set标签
*name属性 多的一方的集合的属性名称 -->
<set name="uu">
<!-- key标签
*column属性 :多的一方的外键的名称-->
<key column="u_k"></key>
<!-- one-to-many标签
*class属性:多的一方的类的全路径 -->
<one-to-many class="cn.com.dao.User"/>
</set>
</class>
</hibernate-mapping>
这里有特别需要注意的是:
把两个映射文件放在核心配置文件里面
<mapping resource="cn/com/dao/Kinds.hbm.xml" />
<mapping resource="cn/com/dao/User.hbm.xml" />
测试类如下:
package cn.com.test;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import cn.com.dao.Kinds;
import cn.com.dao.User;
import cn.com.util.Hibernate_Utils;
public class Demo5 {
/*
* auther:命运的信徒 time:2018/11/23 arm:hibernate 一对多关系的练习 重点知识
*/
@Test
public void demo() {
// 1.连接数据库、
Session session = Hibernate_Utils.openSession();
// 2.开启事务
Transaction tx = session.beginTransaction();
// 3.选择实体类的操作数据库查询方式
Kinds k = new Kinds();
k.setKinds("总经理");
User u = new User();
u.setNumber("001");
u.setName("小周");
User u1 = new User();
u1.setNumber("002");
u1.setName("小应");
User u2 = new User();
u2.setNumber("003");
u2.setName("小田");
k.getUu().add(u);
k.getUu().add(u1);
k.getUu().add(u2);
u.setKk(k);
u1.setKk(k);
u2.setKk(k);
session.save(k);
session.save(u);
session.save(u1);
session.save(u2);
tx.commit();
session.close();
}
}
结果如下: