文档章节

Hibernate06-关联关系映射

南久久
 南久久
发布于 2017/07/27 15:05
字数 1517
阅读 5
收藏 0

一 一对多单项关联

Country.class

import java.io.Serializable;
import java.util.Set;

public class Country implements Serializable{
	private Integer cid;
	private String cname;
	//关联属性
	private Set<Minister> ministers;
  
        public Country() {
		super();
	}
	public Country(String cname) {
		super();
		this.cname = cname;
	}
        geters seters tostring
}

Minister.class

import java.io.Serializable;

public class Minister implements Serializable{
	private Integer mid;
	private String mname;
	public Minister() {
		super();
	}
	public Minister(String mname) {
		super();
		this.mname = mname;
	}
        geters seters toString
	
}

Country.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.bjsxt.pojo">
	<class name="Country">
		<id name="cid">
			<generator class="native"/>
		</id>
		<property name="cname"/>
		<set name="ministers">
			<!-- 指定当前类在关联表中的外键字段的名称 -->
			<key column="countryId"/> 
			<one-to-many class="Minister"/>
		</set>
		
	</class>
</hibernate-mapping>

Minister.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!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.bjsxt.pojo.Minister">
		<id name="mid">
			<generator class="native"/>
		</id>
		<property name="mname"/>
	</class>
	
	
</hibernate-mapping>

测试代码

@Test
	public void testSave(){
		Session session = HbnUtil.getSession();
		try {
			//5.开启事务
			session.beginTransaction();
			//6.操作数据
			Minister minister1 = new Minister("aaa");
			Minister minister2 = new Minister("bbb");
			Minister minister3 = new Minister("ccc");
			
			Set<Minister> ministers = new HashSet<Minister>();
			
			ministers.add(minister1);
			ministers.add(minister2);
			ministers.add(minister3);
			
			session.save(minister1);
			session.save(minister2);
			session.save(minister3);
			
			//session.save(ministers);
			Country country = new Country("UAE");
			//关联关系在此建立
			country.setMinisters(ministers);
			
			session.save(country);
			//7.提交事务
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			//8.回滚事务
			session.getTransaction().rollback();
		}
		
	}













//优化版需在构造函数中初始化set,并在映射文件中设置cascade为save-update
@Test
	public void testSave(){
		Session session = HbnUtil.getSession();
		try {
			//5.开启事务
			session.beginTransaction();
			//6.操作数据
			Minister minister1 = new Minister("aaa");
			Minister minister2 = new Minister("bbb");
			Minister minister3 = new Minister("ccc");
			
			
			Country country = new Country("UAE");
			//关联关系在此建立
			
			country.getMinisters().add(minister1);
			country.getMinisters().add(minister2);
			country.getMinisters().add(minister3);
			
			//save谁就是谁维护关联关系
			session.save(country);
			//7.提交事务
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			//8.回滚事务
			session.getTransaction().rollback();
		}
		
	}

二 一对多双向关联

Country.class

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

public class Country implements Serializable{
	private Integer cid;
	private String cname;
	//关联属性
	private Set<Minister> ministers;
	public Country() {
		ministers = new HashSet<Minister>();
	}
	public Country(String cname) {
		this();
		this.cname = cname;
	}
//get set toString 方法省略

}

Minister.class

import java.io.Serializable;

public class Minister implements Serializable{
	private Integer mid;
	private String mname;
	private Country country;
	public Minister() {
		super();
	}
	public Minister(String mname) {
		super();
		this.mname = mname;
	}
	//get set省略
}

Country.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.bjsxt.pojo">
	<class name="Country">
		<id name="cid">
			<generator class="native"/>
		</id>
		<property name="cname"/>
		<!-- 关联关系维护。inverse表示一方不再维护关联关系 -->
		<set name="ministers" cascade="save-update" inverse="true">
			<!-- 指定当前类在关联表中的外键字段的名称 -->
			<key column="countryId"/> 
			<one-to-many class="Minister"/>
		</set>
	</class>
	
	
</hibernate-mapping>

Minister.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.bjsxt.pojo">
	<class name="Minister">
		<id name="mid">
			<generator class="native"/>
		</id>
		<property name="mname"/>
		<many-to-one name="country" class="Country" column="countryId" cascade="save-update"/>
	</class>
	
	
</hibernate-mapping>

 

测试代码

Country country = new Country("UAE");
			
			Minister minister1 = new Minister("aaa");
			Minister minister2 = new Minister("bbb");
			Minister minister3 = new Minister("ccc");
			
			
			//关联关系在此建立
			minister1.setCountry(country);
			minister2.setCountry(country);
			minister3.setCountry(country);
			
			//save谁就是谁维护关联关系
			session.save(minister1);
			session.save(minister2);
			session.save(minister3);

三 自关联

NewsLabel.class

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

public class NewsLabel implements Serializable{
	private Integer id;
	private String name;
	private String content;
	//作为一方
	private Set<NewsLabel> newsLabels;//子栏目
	//作为多方
	private NewsLabel newsLabel;//父栏目
	public NewsLabel() {
		newsLabels = new HashSet<NewsLabel>();
	}
	public NewsLabel(String name, String content) {
		this();
		this.name = name;
		this.content = content;
	}
	//get set ..

}

NewsLabel.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.bjsxt.pojo">
	<class name="NewsLabel">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<property name="content"/>
		<!-- 作为一方 -->
		<set name="newsLabels" cascade="save-update">
			<key column="pid"/>
			<one-to-many class="NewsLabel"/>
		</set>
		
		<!-- 作为多方 -->
		<many-to-one name="newsLabel" class="NewsLabel" column="pid" cascade="save-update"/>
	</class>
	
	
</hibernate-mapping>

测试代码

	@Test
	public void testSave(){
		Session session = HbnUtil.getSession();
		try {
			//5.开启事务
			session.beginTransaction();
			//6.操作数据
			NewsLabel childnewslabel1 = new NewsLabel("焦点新闻","孙杨获胜孙杨获胜孙杨获胜");
			NewsLabel childnewslabel2 = new NewsLabel("时政新闻","孙政才下马");
			
			NewsLabel parentnewsLabel = new NewsLabel("新闻栏目","新闻栏目新闻栏目新闻栏目");
			//关联关系在此建立
			childnewslabel1.setNewsLabel(parentnewsLabel);
			childnewslabel2.setNewsLabel(parentnewsLabel);
			//save谁就是谁维护关联关系
			session.save(childnewslabel1);
			session.save(childnewslabel2);
			//7.提交事务
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			//8.回滚事务
			session.getTransaction().rollback();
		}
		
	}
	@Test
	public void testSave1(){
		Session session = HbnUtil.getSession();
		try {
			//5.开启事务
			session.beginTransaction();
			//6.操作数据
			NewsLabel childnewslabel1 = new NewsLabel("焦点新闻","孙杨获胜孙杨获胜孙杨获胜");
			NewsLabel childnewslabel2 = new NewsLabel("时政新闻","孙政才下马");
			
			NewsLabel parentnewsLabel = new NewsLabel("新闻栏目","新闻栏目新闻栏目新闻栏目");
			//关联关系在此建立
			parentnewsLabel.getNewsLabels().add(childnewslabel1);
			parentnewsLabel.getNewsLabels().add(childnewslabel2);
			//save谁就是谁维护关联关系
			session.save(parentnewsLabel);
			//7.提交事务
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			//8.回滚事务
			session.getTransaction().rollback();
		}
		
	}

四 多对一单项关联

Country.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.bjsxt.pojo">
	<class name="Country">
		<id name="cid">
			<generator class="native"/>
		</id>
		<property name="cname"/>
	</class>
	
	
</hibernate-mapping>

 Minister.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.bjsxt.pojo">
	<class name="Minister">
		<id name="mid">
			<generator class="native"/>
		</id>
		<property name="mname"/>
		<many-to-one name="country" class="Country" column="countryId" cascade="save-update"/>
	</class>
	
	
</hibernate-mapping>

 测试代码

Country country = new Country("UAE");
			
			Minister minister1 = new Minister("aaa");
			Minister minister2 = new Minister("bbb");
			Minister minister3 = new Minister("ccc");
			
			
			//关联关系在此建立
			minister1.setCountry(country);
			minister2.setCountry(country);
			minister3.setCountry(country);
			
			//save谁就是谁维护关联关系
			session.save(minister1);
			session.save(minister2);
			session.save(minister3);

五 多对多双向关联

Course.class

package com.bjsxt.pojo;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

public class Course implements Serializable{
	private Integer cid;
	private String cname;
	//关联属性
	private Set<Student> students;
	public Course() {
		students = new HashSet<Student>();
	}
	public Course(String cname) {
		this();
		this.cname = cname;
	}


}

Student.class

package com.bjsxt.pojo;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

public class Student implements Serializable{
	private Integer sid;
	private String sname;
	//关联属性
	private Set<Course> courses;
	public Student() {
		courses = new HashSet<Course>();
	}
	public Student(String sname) {
		this();
		this.sname = sname;
	}

}

Course.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.bjsxt.pojo">
	<class name="Course">
		<id name="cid">
			<generator class="native"/>
		</id>
		<property name="cname"/>
		<set name="students"  table="middle" cascade="save-update">
			<key column="courseId"/>
			<many-to-many class="Student" column="studentId"/>
		</set>
	</class>
	
	
</hibernate-mapping>

Student.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.bjsxt.pojo">
	<class name="Student">
		<id name="sid">
			<generator class="native"/>
		</id>
		<property name="sname"/>
		<set name="courses" table="middle" cascade="save-update">
			<key column="studentId"/>
			<many-to-many class="Course" column="courseId"/>
		</set>
	</class>
	
	
</hibernate-mapping>

测试代码

@Test
	public void testSave(){
		Session session = HbnUtil.getSession();
		try {
			//5.开启事务
			session.beginTransaction();
			//6.操作数据
			Course course1 = new Course("Struts2");
			Course course2 = new Course("Hibernate4");
			Course course3 = new Course("Spring4");
			
			Student student1 = new Student("zzy");
			Student student2 = new Student("zzy2");
			
			//关联关系在此建立
			student1.getCourses().add(course1);
			student1.getCourses().add(course2);
			student1.getCourses().add(course3);
			
			student2.getCourses().add(course1);
			student2.getCourses().add(course3);
			
			//save谁就是谁维护关联关系
			session.save(student1);
			session.save(student2);
			//7.提交事务
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			//8.回滚事务
			session.getTransaction().rollback();
		}
		
	}

 

© 著作权归作者所有

南久久
粉丝 0
博文 44
码字总数 20109
作品 0
银川
私信 提问
hibernate七种对应关系映射

首先我们了解一个名词ORM,全称是(Object Relational Mapping),即对象关系映射。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现,这样开发人员就可以把对数据库的...

无敌小学僧
2018/05/17
32
0
Hibernate映射解析——七种映射关系

首先我们了解一个名词ORM,全称是(Object Relational Mapping),即对象关系映射。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现,这样开发人员就可以把对数据库的...

universeye
2014/05/15
186
0
Hibernate框架学习之注解配置关系映射

上篇文章我们通过注解对映射了单个实体类,但是具体项目中往往实体类之间又是相互关联的,本篇文章就是从实体类之间存在的不同关联角度,具体学习下如何映射他们之间的关联,主要涉及内容如下...

Single_YAM
2017/11/15
0
0
Hibernate利用关联关系操纵对象

Hibernate利用关联关系操纵对象 数据对象之间关联关系有一对一、一对多及多对多关联关系。在数据库操作中,数据对象之间的关联关系使用JDBC处理很困难。本节讲解如何在Hibernate中处理这些对...

猴亮屏
2014/10/07
108
0
Hibernate映射——多对一单向关联映射(四)

这篇博客,我们开始介绍基于基本映射的关联关系映射。 概念 基本映射是对一个实体进行映射,关联映射就是处理多个实体之间的关系,将关联关系映射到数据库中,所谓的关联关系在对象模型中有一...

architect刘源源
2018/01/11
9
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot + Mybatis-Plus 集成与使用(二)

前言: 本章节介绍MyBatis-Puls的CRUD使用。在开始之前,先简单讲解下上章节关于Spring Boot是如何自动配置MyBatis-Plus。 一、自动配置 当Spring Boot应用从主方法main()启动后,首先加载S...

伴学编程
昨天
7
0
用最通俗的方法讲spring [一] ──── AOP

@[TOC](用最通俗的方法讲spring [一] ──── AOP) 写这个系列的目的(可以跳过不看) 自己写这个系列的目的,是因为自己是个比较笨的人,我曾一度怀疑自己的智商不适合干编程这个行业.因为在我...

小贼贼子
昨天
7
0
Flutter系列之在 macOS 上安装和配置 Flutter 开发环境

本文为Flutter开发环境在macOS下安装全过程: 一、系统配置要求 想要安装并运行 Flutter,你的开发环境需要最低满足以下要求: 操作系统:macOS(64位) 磁盘空间:700 MB(不包含 IDE 或其余...

過愙
昨天
6
0
OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
昨天
2.7K
16
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
昨天
42
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部