`

hibernate(4):hibernate映射关系续

 
阅读更多

看完多对一,再来看看一对一的情况:

学生和证件是一对一的关系,并且学生ID和证件的ID是相同的。

 

建表脚本:

 

create table certificate(
    id varchar(100) not null default '',
    `describe` varchar(100) default '',
    primary key (id)
)

create table student(
    id varchar(100) not null default'',
    name varchar(20) default'',
    `cardId` varchar(20) not null default'',
    age int(11) default'0',
    primary key(id)
)

 

Student.java

package com.hibernate.model;

public class Student {
	private String id; //标识ID
	private String cardId;//学号
	private String name;//姓名
	private int age;//年龄 
	private Certificate cer;//身份证
	private Team team;//班级
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getCardId() {
		return cardId;
	}
	public void setCardId(String cardId) {
		this.cardId = cardId;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Certificate getCer() {
		return cer;
	}
	public void setCer(Certificate cer) {
		this.cer = cer;
	}
	public Team getTeam() {
		return team;
	}
	public void setTeam(Team team) {
		this.team = team;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}

 

 

package com.hibernate.model;

public class Certificate {
	private String id;
	private String describe;
	private Student stu;
	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public Student getStu() {
		return stu;
	}

	public void setStu(Student stu) {
		this.stu = stu;
	}

	public String getDescribe() {
		return describe;
	}

	public void setDescribe(String describe) {
		this.describe = describe;
	}

}

 

Student.hbm.xml 

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC    
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.hibernate.model.Student" table="student">
		<id name="id" unsaved-value="null">
			<generator class="uuid.hex"/><!-- 这表示用hibernate的字符序列生成ID -->
		</id>
		<property name="cardId" type="string"/><!-- 没有指定 column,则列名和属性名是一样的 -->
		<property name="name" type="string"/>
		<property name="age" type="int"/>
		<one-to-one name="cer" class="com.hibernate.model.Certificate" fetch="join" cascade="all">
		</one-to-one>
	</class>
</hibernate-mapping>

 

Certificate.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC    
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.hibernate.model.Certificate" table="certificate" lazy="true">
		<id name="id">
			<!-- 下面表示引用Certificate的id引用Student的id -->
			<generator class="foreign">
				<!-- 对应Certificate类的stu属性 -->
				<param name="property">stu</param>
			</generator>
		</id>
		<!-- 因为describe是mysql的关键字,所以下面要用`号(数字键1旁边的字符)表示 -->
		<property name="describe" column="`describe`" type="string"/>
		<one-to-one name="stu" class="com.hibernate.model.Student" fetch="select" 
			constrained="true" cascade="none">
		</one-to-one>
	</class>
</hibernate-mapping>

 

在hibernate.hbm.xml中加上映射

    	<mapping resource="Student.hbm.xml"></mapping>
    	<mapping resource="Certificate.hbm.xml"></mapping>

 

测试类

package com.hibernate.util;

import org.hibernate.Session;
import org.hibernate.Transaction;
import com.hibernate.model.Certificate;
import com.hibernate.model.Student;

public class BM {
	public static void main(String[] args) {
		Session session = HibernateUtil.currentSession();
		Transaction tx = null;
		try {
			tx = session.beginTransaction();
			//实例化student
			Student stu = new Student();
			stu.setName("lisi");
			stu.setCardId("200202");
			stu.setAge(18);
			//实例化certificate
			Certificate certificate = new Certificate();
			certificate.setDescribe("lisi_certificate");
			//设置关联
			stu.setCer(certificate);
			certificate.setStu(stu);
			//只保存student,certificate会自动保存
			session.save(stu);
			tx.commit();
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			HibernateUtil.closeSession(session);
		}
	}
}

 

 

再来看看一对一的另一种情况,即certificate表中添加一个stu_id字段,这个字段用来关联引用Student的id,

这也是在实际开发中用的最多的。

针对这种情况,只需要修改上例中的Certificate.hbm.xml文件,将one-to-one修改成many-to-one,如下所示,其它类不需要修改。

 

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC    
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.hibernate.model.Certificate" table="certificate" lazy="true">
		<id name="id">
			<generator class="uuid.hex">
			</generator>
		</id>
		<property name="describe" column="`describe`" type="string"/>
		<!-- unique表示此字段值唯一,它可将many-to-one改造成one-to-one -->
		<many-to-one name="stu" class="com.hibernate.model.Student" unique="true" column="stu_id"/>
	</class>
</hibernate-mapping>

 

Hibernate多对多映射

 假设有学生(student)和课程(course)的多对多映射。它们使用一张关联表(student_course)来保存关联关系。

建表脚本

 

create table course(
    id varchar(32) not null default'',
    name varchar(20),
    primary key(id)
)

create table student(
    id varchar(32) not null default'',
    cardId varchar(20),
    name varchar(20),
    age int(20)
)
--学生与课程关联表
create table student_course(
    student_id varchar(32) not null default'',
    course_id varchar(32) not null default''
)

 

Student.java

package com.hibernate.model;

import java.util.HashSet;
import java.util.Set;

public class Student {
	private String id; //标识ID
	private String cardId;//学号
	private String name;//姓名
	private int age; //年龄 
	private Set courses = new HashSet();//课程
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getCardId() {
		return cardId;
	}
	public void setCardId(String cardId) {
		this.cardId = cardId;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public Set getCourses() {
		return courses;
	}
	public void setCourses(Set courses) {
		this.courses = courses;
	}
}

 

Course.java

package com.hibernate.model;

import java.util.HashSet;
import java.util.Set;

public class Course {
	private String id;
	private String name;
	private Set students = new HashSet();

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Set getStudents() {
		return students;
	}

	public void setStudents(Set students) {
		this.students = students;
	}

	
}

 

Student.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC    
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.hibernate.model.Student" table="student">
		<id name="id" unsaved-value="null">
			<generator class="uuid.hex"/>
		</id>
		<property name="cardId" type="string"/><!-- 没有指定 column,则列名和属性名是一样的 -->
		<property name="name" type="string"/>
		<property name="age" type="int"/>
		<set name="courses" table="student_course" cascade="none" inverse="true">
			<!--下面这两个column都是对应关联表中的字段-->
			<key column="student_id"/>
			<many-to-many class="com.hibernate.model.Course" column="course_id"/>
		</set>
	</class>
</hibernate-mapping>

 

Course.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC    
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.hibernate.model.Course" table="course">
		<id name="id">
			<generator class="uuid.hex"/>
		</id>
		<property name="name" type="string"/>
		<set name="students" table="student_course" cascade="save-update">
			<key column="course_id"/>
			<many-to-many class="com.hibernate.model.Student" column="student_id"/>
		</set>
	</class>
</hibernate-mapping>

 

测试类

package com.hibernate.util;

import org.hibernate.Session;
import org.hibernate.Transaction;
import com.hibernate.model.Course;
import com.hibernate.model.Student;

public class BM {
	public static void main(String[] args) {
		saveStudentCourse();
	}
	public static void saveStudentCourse(){
		Session session = HibernateUtil.currentSession();
		Student student = null;
		Course course = null;
		Transaction tx = null;
		try{
			tx = session.beginTransaction();
			student = (Student) session.createQuery("from Student s where s.name='hp'").uniqueResult();
			course = (Course) session.createQuery("from Course s where s.name='English'").uniqueResult();
			student.getCourses().add(course);
			course.getStudents().add(student);
			tx.commit();
		}catch (Exception e) {
			e.printStackTrace();
		}finally{
			HibernateUtil.closeSession(session);
		}
	}
}

 

运行后,会自动在Student_Course表中保存关联数据。

分享到:
评论

相关推荐

    Hibernate教程20_关系映射案例三

    【标题】"Hibernate教程20_关系映射案例三"主要涵盖了在Hibernate框架中如何进行对象关系映射(ORM)的实践,特别是针对复杂关系的处理。在这个教程中,我们可能会学习到以下关键知识点: 1. **关系映射**:...

    curso-hibernate:Hibernate示例

    内容:hibernate001:通过 XML 配置的基本示例 hibernate002:通过注释配置的基本示例 hibernate003:会话方法练习 hibernate004:组件使用示例 hibernate005:单向关系映射示例 hibernate006:双向关系映射示例 ...

    hibernate 映射关系学习入门 多对多实体映射

    本教程将带你入门Hibernate的多对多实体映射,帮助你理解如何通过源码来实现这种复杂的关系映射。 一、Hibernate概述 Hibernate是一个对象关系映射(ORM)框架,它允许我们将Java对象(实体)与数据库表进行映射,...

    Hibernate对象关系映射

    Hibernate对象关系映射一对多 很基础等文档

    Hibernate教程09_关系映射之组件映射

    在本教程中,我们将深入探讨Hibernate中的一个关键概念——关系映射中的组件映射。Hibernate作为Java领域中广泛使用的对象关系映射(ORM)框架,它允许开发人员以面向对象的方式处理数据库操作,极大地简化了数据层...

    Hibernate映射解析 七种映射关系 后端 - Java.zip

    这个名为“Hibernate映射解析 七种映射关系 后端 - Java”的压缩包文件显然包含了关于Hibernate映射关系的详细讲解。让我们深入探讨一下Hibernate的映射解析及其七种主要的映射关系。 首先,Hibernate通过XML映射...

    hibernate关联映射详解

    hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,包含4个说明文档,分别详细解说了hibernate关联映射的关联关系,...

    Beginning Hibernate: For Hibernate 5

    - **定义**: Hibernate 是一款流行的开源对象关系映射(ORM)框架,它简化了数据库与 Java 对象之间的交互过程。 - **版本**: 本书针对 Hibernate 5.0 版本进行了更新和介绍,这是在 Java 社区中广泛使用的最新版本...

    Hibernate初之单表映射学习例子

    4. **XML映射文件**:解释Hibernate的Hibernate Configuration File (hbm.xml)和Entity Mapping File (hbm.xml),它们描述了实体类和数据库表之间的映射关系。 5. **SessionFactory和Session**:描述SessionFactory...

    Hibernate的关联关系映射图解

    Hibernate4中映射关系图解。

    Hibernate数据类型映射关系

    关于Hibernate的基本数据类型与Java中基本数据类型的映射关系

    Hibernate4(关系映射-事务-原理-性能和二级缓存-最佳实践)

    Hibernate 4是该框架的一个版本,它涵盖了关系映射、事务处理、原理、性能优化以及二级缓存的使用与最佳实践。以下知识点详细解释了这些关键概念。 1. 关系映射:在Hibernate框架中,关系映射是指对象与数据库表...

    精通Hibernate:Java对象持久化技术详解.pdf

    《精通Hibernate:Java对象持久化技术详解》这本书深入剖析了Hibernate这一流行的Java对象关系映射(ORM)框架,旨在帮助开发者全面理解并熟练掌握Hibernate的使用。Hibernate是Java开发中的重要工具,它简化了...

    Hibernate映射关系配置:XML方式和注解方式

    标题“Hibernate映射关系配置:XML方式和注解方式”涉及到的是Java持久层框架Hibernate中的一个重要概念——对象关系映射(ORM)。在这个主题中,我们将探讨如何通过XML映射文件和注解来配置Hibernate实体之间的关系...

    Hibernate案例:办公自动系统

    Hibernate 是一款强大的开源对象关系映射(ORM)框架,它为Java开发者提供了数据持久化的解决方案,极大地简化了数据库操作。在这个名为“办公自动系统”的案例中,我们可以深入理解Hibernate的核心概念和实际运用。...

    精通Hibernate:Java对象持久化详解.zip

    Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了Java应用中的数据库操作,使得开发者能够更专注于业务逻辑而不是繁琐的SQL代码。 在Java开发中,持久化是将应用程序中的对象状态保存到持久存储介质...

    Hibernate教程04_关系映射之一对一单向外键关联

    4. **配置XML映射文件**:如果不使用注解,可以在.hbm.xml文件中定义映射,使用标签来配置一对一关系。 5. **持久化操作**:使用SessionFactory创建Session,通过Session进行CRUD(创建、读取、更新、删除)操作。...

    JAVA数据类型与Hibernate的类型映射

    此外,自定义对象的映射是Hibernate映射中的一个重要部分。通过在实体类上使用@Entity注解,并使用@Id注解指定主键字段,可以将一个Java类映射到数据库的一张表。字段则通过@Column注解来指定列名和属性,如长度、...

Global site tag (gtag.js) - Google Analytics