`

8.Hibernate的一对多和多对一双向关联映射

阅读更多

核心代码:

<many-to-one name="classes" column="classesId"/>

<set name="students" inverse="true" cascade="all">
      <key column="classesId" />
      <one-to-many class="Students" />
 </set>

 

hihernate一对多关联映射(双向Classes<----->Student)

一对多双向关联映射:
    * 在一一端的集合上使用<key>,在对方表中加入一个外键指向一一端
    * 在多一端采用<many-to-one>
   
注意:<key>标签指定的外键字段必须和<many-to-one>指定的外键字段一致,否则引用字段的错误
   
如果在”一“一端维护一对多关联关系,hibernate会发出多余的udpate语句,所以我们一般在多
的一端来维护关联关系

关于inverse属性:
    inverse主要用在一对多和多对多双向关联上,inverse可以被设置到集合标签<set>上,
    默认inverse为false,所以我们可以从”一“一端和”多“一端维护关联关系,
    如果设置成inverse为true,则我们只能从多一端来维护关联关系
   
    注意:inverse属性,只影响数据的存储,也就是持久化
       
inverse和cascade
    * inverse是关联关系的控制方向
    * cascade操作上的连锁反应

 

一:实体类:

package com.tao.hibernate.one2many2;

import java.util.Set;

public class Classes {
	private Integer id;
	private String name;
	private Set<Students> students;

	public Classes() {
		super();
	}

	public Integer getId() {
		return id;
	}

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

	public String getName() {
		return name;
	}

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

	public Set<Students> getStudents() {
		return students;
	}

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

}
 
package com.tao.hibernate.one2many2;

public class Students {
	private Integer id;
	private String name;
	private Classes classes;

	public Students() {
		super();
	}

	public Integer getId() {
		return id;
	}

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

	public String getName() {
		return name;
	}

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

	public Classes getClasses() {
		return classes;
	}

	public void setClasses(Classes classes) {
		this.classes = classes;
	}

}
 

二:映射文件:

<?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 package="com.tao.hibernate.one2many2" auto-import="false">
	<class name="Classes" table="t_classes">
		<id name="id" column="id" type="integer">
			<generator class="native" />
		</id>
		<property name="name" column="name" />
		<set name="students" inverse="true" cascade="all">
			<key column="classesId" />
			<one-to-many class="Students" />
		</set>
	</class>
</hibernate-mapping>
 
<?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 package="com.tao.hibernate.one2many2" auto-import="false">
	<class name="Students" table="t_students">
		<id name="id" column="id" type="integer">
			<generator class="native" />
		</id>
		<property name="name" column="name" />
		<many-to-one name="classes" column="classesId"/>
	</class>
</hibernate-mapping>
 

三:测试类:

package com.tao.hibernate.one2many2;

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

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import com.tao.hibernate.HibernateUtils;

public class TestMain {
	Session session = HibernateUtils.getFactory().openSession();

	@Test
	public void testSave() {
		Students s1 = new Students();
		s1.setName("tao");

		Students s2 = new Students();
		s2.setName("war");

		Classes c = new Classes();
		c.setName("148班");
		Set<Students> students = new HashSet<Students>();
		students.add(s1);
		students.add(s2);
		c.setStudents(students);

		s1.setClasses(c);
		s2.setClasses(c);

		Transaction ts = session.beginTransaction();
		ts.begin();
		session.save(c);
		ts.commit();
	}

	@Test
	public void testLoad() {
		Session session = HibernateUtils.getFactory().openSession();
		Classes c = (Classes) session.load(Classes.class, 1);
		for (Iterator<Students> iter = c.getStudents().iterator(); iter
				.hasNext();) {
			System.out.println(iter.next().getName());
		}
	}

	@Test
	public void testLoad2() {
		Session session = HibernateUtils.getFactory().openSession();
		Students s = (Students) session.load(Students.class, 1);
		System.out.println(s.getName());
		System.out.println(s.getClasses().getName());
	}

}
 

 

分享到:
评论

相关推荐

    Hibernate双向一对一关联映射(注解版)

    在Hibernate中,一对一关联映射分为单向和双向。单向一对一映射通常涉及一个实体持有另一个实体的引用,而双向一对一映射则意味着两个实体都可以互相引用。这种关联关系在数据库层面通常通过主键外键约束来实现,但...

    Hibernate一对一主键关联映射(双向关联)

    标题"Hibernate一对一主键关联映射(双向关联)"中的"主键关联"指的是两个实体通过共享相同的主键来建立关联。"双向关联"则意味着在两个实体类中,都可以直接访问到对方的实例,即在实体A中有一个对实体B的引用,...

    hibernate关联映射详解

    包含《多对多双向关联映射》《多对一单向关联映射》《多对一双向关联映射》《一对多单向关联映射》等文档,并有图解及例子,非常适合新手学习,尤其是刚刚接触hibernate,对映射关系不清楚的。。。。

    hibernate双向一对多关联映射(注解版)

    在Java的持久化框架Hibernate中,双向一对多关联映射是一种常见的关系映射方式,它模拟了数据库中的外键关联,使得一个实体可以拥有多个另一个实体的实例。在这个注解版的实现中,我们将深入探讨如何使用Hibernate的...

    Hibernate关联映射

    9. Hibernate 一对一外键双向关联、主键双向关联、连接表双向关联、一对多外键双向关联、一对多连接表双向关联、多对多双向关联: 这些关联方式与单向关联类似,区别在于两个实体类都知道彼此的关联。在双向关联中...

    Hibernate ORM - 一对多双向关联关系

    这个压缩包文件“HibernateORM”很可能包含了关于如何在实际项目中设置和使用Hibernate一对多双向关联的示例代码、配置文件或者详细教程。通过学习这些材料,开发者能够深入理解如何在Java应用中利用Hibernate来处理...

    hibernate一对多,多对一,一对多双向关联

    “Hibernate 一对多,多对一,一对多双向关联”是指在Java持久化框架Hibernate中,实体间常见的三种关联关系。在数据库设计中,这种关联关系是常见的,例如一个用户可以有多个订单(一对多),一个订单对应一个用户...

    hibernate一对多关联映射(双向关联)

    总之,理解并正确实现Hibernate中的一对多双向关联映射是提升应用程序性能和数据一致性的重要步骤。通过细心配置映射文件,编写相应的实体类,以及妥善处理关联关系的维护,我们可以有效地管理复杂的数据结构。

    hibernate双向一对多关联映射(XML)

    总结起来,Hibernate的双向一对多关联映射(XML)涉及的主要知识点包括:实体类的关联、`&lt;set&gt;`和`&lt;one-to-many&gt;`标签的使用、`&lt;many-to-one&gt;`标签的使用、以及如何在Java代码中维护这种关联。理解并熟练运用这些...

    hibernate核心,一对多,多对多映射讲解,看了就完全搞明白了

    在本章中,我们将深入探讨Hibernate中的关联映射,包括一对多、多对一以及多对多的关系。这些映射关系对于理解如何在Java应用程序中有效地管理数据库对象至关重要。 首先,我们来解决描述中提到的问题。`...

    hibernate多对多关联映射(单项关联)

    在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系模型,它用于处理两个实体类之间存在多个对应关系的情况。这篇博客"hibernate多对多关联映射(单项关联)"深入探讨了如何在Hibernate中实现这种映射...

    hibernate多对多双向关联

    该描述提供了一个博客链接,虽然没有直接给出具体内容,但我们可以假设博客内容会详细解释如何在Hibernate中设置和管理多对多双向关联。这通常包括配置实体类、定义关联映射、使用中间表以及进行增删改查操作。在...

    hibernate双向多对多关联映射(注解版)

    在这个“hibernate双向多对多关联映射(注解版)”的主题中,我们将深入探讨如何使用Hibernate的注解配置来处理数据库中的双向多对多关联关系。 首先,多对多关联在数据库设计中是指两个实体之间存在多个对应关系,...

    Hibernate双向一对多经典实例

    8. **CRUD操作**:实现增删改查(Create, Read, Update, Delete)功能,包括添加新记录、查询、更新和删除记录,确保在处理一对多关系时正确处理关联对象。 9. **事务管理**:由于数据库操作涉及多个步骤,因此需要...

    hibernate 双向多对多关联映射练习

    在Java的持久化框架Hibernate中,双向多对多关联映射是一种常见的数据关系模型,它允许两个实体类之间存在多个实例互相引用的情况。本练习旨在帮助开发者深入理解并熟练运用这种映射方式。通过以下详细讲解,我们将...

    hibernate对映射xml的一对多的双向关联详解

    本篇文章将深入探讨 Hibernate 中的一对多双向关联映射。 在数据库设计中,一对多关联是指一个实体可以与多个其他实体相关联,比如一个学生可以有多个课程,一个部门可以有多名员工。在Hibernate中,这种关系可以...

    hibernate表之间3种双向关联映射

    总结来说,Hibernate中的双向关联映射是对象关系映射的重要组成部分,包括双向多对多、双向一对多和双向一对一。理解并熟练运用这些映射方式,有助于开发者更好地实现Java应用程序与数据库间的交互,提高开发效率和...

    hibernate一对多关联映射

    一、Hibernate一对多关联映射 1.1 单向关联:在单向一对多关联中,一个实体类知道另一个实体类,而另一个实体类并不知情。这通常通过在一方添加一个集合属性来实现,该集合包含另一方的实例。例如,`Department`类...

    Hibernate Annotation 基于外键的一对多双向关联

    本文将深入探讨如何使用Hibernate注解实现基于外键的一对多双向关联。我们将通过具体实例来解析这个主题,并结合源码分析其工作原理。 首先,我们要明白一对多关联意味着一个实体可以拥有多个关联的实体。在数据库...

Global site tag (gtag.js) - Google Analytics