`

hibernate学习4之one-to-many单向关联(不推荐)

阅读更多
一对多和多对一的映射策略是一样的,只是站的角度不同.

多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一
一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多

先上配置文件:
<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
	<session-factory>
		<property name="hibernate.connection.url">jdbc:mysql://localhost/hibernate_one2many_1</property>
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">bjsxt</property>
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<property name="hibernate.show_sql">true</property>
		
		<mapping resource="com/bjsxt/hibernate/Classes.hbm.xml"/>
		<mapping resource="com/bjsxt/hibernate/Student.hbm.xml"/>
	</session-factory>
</hibernate-configuration>

public class Student {
	private int id;
	private String name;
	//setter,getter
}

import java.util.Set;

public class Classes {
	private int id;
	private String name;
	private Set students; //一对多,一个班级对应很多学生
	//setter,getter
	
}

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.bjsxt.hibernate.Student" table="t_student">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
	</class>
</hibernate-mapping>

Classes.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.bjsxt.hibernate.Classes" table="t_classes">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<set name="students">
			<key column="classesid"/>
			<one-to-many class="com.bjsxt.hibernate.Student"/>
		</set>
	</class>
</hibernate-mapping>

上面这个配置在Student一端加入了一个classesid外键;也说明set里存放的是Student对象

测试一下:
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import junit.framework.TestCase;

import org.hibernate.Session;

public class One2ManyTest extends TestCase {

	public void testSave1() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			Student student1 = new Student();
			student1.setName("10");
			session.save(student1);//先save
			
			Student student2 = new Student();
			student2.setName("祖儿");
			session.save(student2);//先save
			
			Set students = new HashSet();
			students.add(student1);
			students.add(student2);
			
			Classes classes = new Classes();
			classes.setName("尚学堂");
			classes.setStudents(students);
			
			//可以正确保存
			session.save(classes);
			
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}	
	
	public void testLoad1() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			Classes classes = (Classes)session.load(Classes.class, 1);
			System.out.println("classes.name=" + classes.getName());
			Set students = classes.getStudents();
			for (Iterator iter=students.iterator(); iter.hasNext();) {
				Student student = (Student)iter.next();
				System.out.println("student.name=" + student.getName());
			}
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}		
}


在一一端维护关系的缺点:
* 如果将t_student表里的classesid字段设置为非空,则无法保存
* 因为不是在student这一端维护关系,所以student不知道是哪个班的,
  所以需要发出多余的update语句来更新关系

因为一对多(单向关联)会发出额外的sql语句,效率没有多对一高,所以通常情况下不采用一对多的单向关联,采用双向关联比较妥当!
分享到:
评论

相关推荐

    hibernate one-to-one 一对一唯一外键关联映射_单向 and 双向

    在Hibernate中,一对一唯一外键关联映射可以通过 `&lt;many-to-one&gt;` 标签来配置。例如,以下是Person实体与IdCard实体的一对一唯一外键关联映射配置: ```xml &lt;many-to-one name="idCard" column="card_id...

    hibernate one-to-many 单/双向关联映射配置心得

    本文主要关注Hibernate中的一个核心概念——一对一(One-to-One)、一对多(One-to-Many)和多对一(Many-to-One)关联映射,特别是关于“一到多”单向和双向关联映射的配置心得。 首先,让我们了解“一到多”关联...

    myeclipse试用小记----Hibernate多对一单向关联(1)

    3. **映射文件**:如果使用传统的Hibernate XML映射文件,需要在`.hbm.xml`文件中配置多对一关联,设置`&lt;many-to-one&gt;`标签。如果是注解方式,直接在Java类中使用上述提到的注解。 4. **数据访问对象(DAO)**:...

    Hibernate单向关联代码示例

    "Hibernate单向关联代码示例"是一个实用的学习资源,帮助开发者理解如何在实际项目中实现单向关联。在这个示例中,你将看到两个实体类之间的单向关联,并学习到如何在Java代码中配置和操作这些关联。 单向关联分为...

    hibernate-one-to-many-uni

    【标题】"hibernate-one-to-many-uni" 指的是在Hibernate框架下实现的一对多单向关联关系。Hibernate是Java开发中常用的持久化框架,它简化了数据库操作,使得开发者可以更加专注于业务逻辑而不是数据库交互。在这个...

    Hibernate性能调优

    关联通常包括以下几种类型:单向`one-to-many`关联、双向`one-to-many`关联、`many-to-one`关联以及`one-to-one`关联。 ##### 单向`one-to-many`关联 - **定义**:单向`one-to-many`关联是指一个实体可以拥有多个...

    hibernate 全面学习->hibernate 关联映射学习

    `hibernate_one2many_1`和`hibernate_one2many_2`的示例可能分别展示了单向和双向的一对多映射。单向映射意味着只有父类知道子类的存在,而双向则允许双方相互引用。在配置中,这通常涉及到`@OneToMany`注解的使用,...

    hibernate的关联映射

    关联映射主要包括四种类型:一对一(One-to-One)、一对多(One-to-Many)、多对一(Many-to-One)和多对多(Many-to-Many)。下面我们将逐一探讨这些关联映射的配置方法。 1. **一对一关联映射** - **主键关联**...

    Hibernate学习:单向多对一关联 工程

    本项目“Hibernate学习:单向多对一关联 工程”专注于讲解Hibernate中的单向多对一关联映射,这是数据库设计中常见的关系类型,尤其在处理具有层次结构的数据时。 单向多对一关联指的是在一个实体类中有一个引用,...

    Hibernate教程10_关系映射之多对一单向关联

    压缩包中的`s2sh_relation07_many2one_uni`可能是示例项目的名称,暗示这是一个基于Spring、Struts2和Hibernate(S2SH)的项目,其中包含了多对一单向关联的实例代码。你可以下载并运行这个项目,以便更直观地理解...

    hibernate实体关联关系映射

    2. **一对多关联**(One-to-Many / Many-to-One) - 外键单向关联 - 连接表单向关联 - 外键双向关联 - 连接表双向关联 3. **多对多关联**(Many-to-Many) - 单向关联 - 双向关联 每种关联类型都有其特定的...

    Hibernate关联映射

    4. Hibernate 一对多外键单向关联: 在这种关联中,一个实体类(如 Department)可以有多个实体类(如 Employee)与其关联,而 Employee 并不知道这个关联。配置上,会在 Employee 实体类中使用 `many-to-one` 元素...

    hibernate_1700_one2many_many2one_bi_crud(5)

    标题中的“hibernate_1700_one2many_many2one_bi_crud(5)”指的是一项关于Hibernate框架的教程,重点在于介绍一对多(One-to-Many)和多对一(Many-to-One)双向关联关系的创建、读取、更新和删除(CRUD)操作。...

    Hibernate一对多单向关联(annotation/xml)

    在Hibernate的XML映射文件中,我们可以使用`&lt;one-to-many&gt;`和`&lt;many-to-one&gt;`元素来定义关联。 1. **在父类的映射文件中**,使用`&lt;one-to-many&gt;`元素声明一对多关联,并通过`class`属性指定子类的全限定类名。 ```...

    Hibernate关联关系映射目录

    单向关联指的是对象之间的关联关系只在一个方向上存在,也就是说这种关联关系仅在一个类中表示出来,在另一个类中不体现这种关联。 ##### 1. 一对一外键单向关联 在一对一外键单向关联中,两个实体之间通过一个...

    Hibernate 一对多外键单向关联

    在Java持久化框架Hibernate中,一对多外键单向关联是一种常见的关系映射方式,它描述了一对多的关系,其中一个实体(例如Person)可以与多个其他实体(例如Address)相关联,而关联的方向只从多方(Address)指向...

    Hibernate一对多单向关联映射

    本篇主要探讨的是如何在Hibernate中实现一对多的单向关联映射。 一、概念理解 一对多关联意味着一个实体(如部门)可以有多个关联实体(如员工),而反过来,每个员工只属于一个部门。单向关联则表示只有部门知道其...

    Hibernate入门到精通

    在Hibernate中,`&lt;set&gt;`或`&lt;list&gt;`标签用于表示集合,而`&lt;one-to-many&gt;`标签定义关联。 - 双向一对多:在双向关联中,`Class`和`Student`都能直接访问对方的集合,需在两个实体的映射文件中分别设置。 4. 多对多...

    HIbernate关联关系总结

    本篇文章将详细讲解Hibernate的两种单向关联关系:单向1-N关联和单向N-1关联。 1. **单向1-N关联** 在这种关联关系中,一个实体(1端)可以与多个其他实体(N端)相关联。在Hibernate中,通常在1端的实体类中引入...

Global site tag (gtag.js) - Google Analytics