Hibernate的一对多和多对一的映射
Hibernate的一对多和多对一的映射
单向
一到多的映射
通过set来配置,set标签的属性有
以学生和班级的关系为例
在一方即班级的映射文件中可以这样配置
<set name="students" table="student">
<key column="gid"></key>
<one-to-many class="com.imooc.entity.Student"/>
</set>
多到一的映射
在多方即学生的映射文件中可以这样配置
<many-to-one name="grade" class="com.imooc.entity.Grade" column="gid">
</many-to-one>
双向
在在班级和学生的映射文件中将以上的两个配置都加入其中
为了进一的优化属性可以在一方的set中对属性inverse进行配置即其中关于inverse的说明如下:
inverse的默认值为false,即由一方来维护关联关系,我们将inverse的值设置为ture则变为由多方进行维护。
import java.util.HashSet;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.imooc.entity.Grade;
import com.imooc.entity.Student;
import com.imooc.util.HibernateUtil;
/**
*
* @author Administrator
*单向多对一
*学生--->班级
*/
public class Test02 {
public static void main(String args[]){
save();
}
//保存
public static void save(){
Grade g =new Grade("java一班", "java开发一班");
Student stu1 =new Student("模女神", "女");
Student stu2 = new Student("小木木", "男");
g.getStudents().add(stu1);
g.getStudents().add(stu2);
stu1.setGrade(g);
stu2.setGrade(g);
Session session = HibernateUtil.getSession();
Transaction tx =session.beginTransaction();
session.save(g);//级联操作
session.save(stu1);//cascade="save-update"就不需要显示的保存学生了
session.save(stu2);
tx.commit();
HibernateUtil.closeSession(session);
}
}
对与以上的测试类,如果结果inverse的属性值为false则执行时内部的操作为为
我们发现在插入之后还有两条更新语句,显然是不需要的,影响性能。而将inverse的属性设置为true后由多方进行维护就不会有之后的update语句结果如下:
在测试代码中我们会发现,在保存班级session.save(g)之后还要保存学生,为了更好的提供性能我们可以在班级的映射文件中设置set的属性cascade值,首先介绍cascade这个属性
我们可以在班级的映射文件中设值set属性cascade="save-update"则在保存和更新班级时将学生表中没有的学生插入学生表。这时不需要显示的对学生进行保存,即session.save(stu1);session.save(stu2);不再需要。
也可以在学生的映射文件中many-to-one的属性cascade的值为cascade="all",在对学生进行增删改查的时候也对班级进行级联操作。
最后完整的映射文件
班级映射文件Grade.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.imooc.entity.Grade" table="grade">
<id name="gid" column="gid" type="java.lang.Integer">
<generator class="increment"></generator>
</id>
<property name="gname" type="java.lang.String">
<column name="gname" length="20" not-null="true"></column>
</property>
<property name="gdesc">
<column name="gdesc"></column>
</property>
<!-- 配置一对多关联关系 ,设置inverse属性为true:多方维护关联关系;当进行保存和更新时进行级联操作所关联的对象-->
<set name="students" table="student" inverse="true" cascade="save-update">
<key column="gid"></key>
<one-to-many class="com.imooc.entity.Student"/>
</set>
</class>
</hibernate-mapping>
学生映射文件Student.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.imooc.entity.Student" table="student">
<id name="sid" column="sid" type="java.lang.Integer">
<generator class="increment"></generator>
</id>
<property name="sname" type="java.lang.String">
<column name="sname" length="20" not-null="true"></column>
</property>
<property name="sex" type="java.lang.String">
<column name="sex"></column>
</property>
<!-- 配置多对一 关联关系-->
<many-to-one name="grade" class="com.imooc.entity.Grade" column="gid" cascade="all"></many-to-one>
</class>
</hibernate-mapping>
附1:Myeclipse对Hibernate的添加支持功能
1、新建一个项目
2、在Myeclipse里打开数据库视图
点击如图所示图标
出现
点击Myeclipse Datebase Explorer
3、新建数据库连接
连接配置如下:
点击Test driver测试,点击finish完成
4.右击项目,添加Myeclipse支持
5、选择Hibernate版本
6、创建Hibernate核心配置文件和工具类
7、选择数据库连接,选择之前创建的数据库连接
8、jar包选择
附2:Myeclipse反向生成映射文件
1、创建包存储持久化类和映射文件
2、进入数据库视图
3、对表选择反向工程
4、切换为企业开发视图查看结果
附3:java数据类型和Hibernate数据类型的对应关系