Hibernate 一对多的关联映射

首先回顾一下以前没有用框架,普通的一对多的关联映射的做法:

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、columnuser表中外键的名称、不是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();
	}
}

结果如下:

 

猜你喜欢

转载自blog.csdn.net/qq_37591637/article/details/84424140
今日推荐