`
Luob.
  • 浏览: 1592188 次
  • 来自: 上海
社区版块
存档分类
最新评论

Hibernate 关系映射(6) 基于中间表关联的单向1:N

阅读更多
基于中间表关联的单向1:N
单向 1 对 N 关联,注意 和 N:1 是相反的

想象下: 吃大锅饭的时候 ,就是很多人住一个地方,一个房间,一个大炕上

eg:  一个地方有多个人住.或者说 多家人
eg:  每个同学记住老师,比老师记住每个同学简单.
(在 n 的一端进行配置效率高)

N            1
Person   : Address
Student  : Teacher

这个里面放的是
单向N 对 1
包括  
无连接表的 N : 1
有连接表的 N : 1

注意需求 是:
以前N:1 是在N的一端配置,也就是因为多个人记住老师 比较容易
现在要在 1的一端配置,就是让一个老师记住所有同学  (这个老师 记忆力比较好) 所以会有 一个集合 放置 所有同学

种类
FKrelated: 基于外键关联
TBrelated: 基于中间表管理

中间表


Teacher



Student




public class Student {

	private Integer sid;
	private String sno;
	private String name;
	private int age;
//...

}

public class Teacher {

	private Integer tid;
	private String name;
	private int age;
	private Double salary;
	
	private Set<Student> students=new HashSet<Student>();


//....
}



DROP TABLE IF EXISTS mytest.teacher_student;

CREATE TABLE mytest.teacher_student
	(
	teacher_id INT NOT NULL,
	student_id INT NOT NULL,
	PRIMARY KEY (teacher_id, student_id),
	UNIQUE KEY student_id (student_id),
	KEY FK2E2EF2DE482FD2B0 (teacher_id),
	KEY FK2E2EF2DE37948810 (student_id),
	CONSTRAINT FK2E2EF2DE37948810 FOREIGN KEY (student_id) REFERENCES student (SID),
	CONSTRAINT FK2E2EF2DE482FD2B0 FOREIGN KEY (teacher_id) REFERENCES teacher (TID)
	);

DROP TABLE IF EXISTS mytest.teacher;

CREATE TABLE mytest.teacher
	(
	TID    INT NOT NULL,
	NAME   VARCHAR (255),
	AGE    INT,
	SALARY DOUBLE,
	PRIMARY KEY (TID)
	);

	DROP TABLE IF EXISTS mytest.student;

CREATE TABLE mytest.student
	(
	SID  INT NOT NULL,
	SNO  VARCHAR (255),
	NAME VARCHAR (255),
	age  INT,
	PRIMARY KEY (SID)
	);


<hibernate-mapping package="com.sh.study.model.o2n.TBrelated">
	<class name="Teacher" table="TEACHER">
		<id name="tid" type="java.lang.Integer" column="TID">
			<generator class="increment"/>
		</id> 
		<property name="name" type="java.lang.String">
			<column name="NAME" />
		</property>
		<property name="age" type="int">
			<column name="AGE" />
		</property>
		<property name="salary" type="java.lang.Double">
			<column name="SALARY" />
		</property>
	
		<!-- 无连接表的 1:N 
		<set name="students1" cascade="all">
			<key column="tid"/>
			<one-to-many class="Student"/>
		</set>
		 -->
		 
		<!-- 基于连接表的 1:N 注意采用  many-to-many 替换 one-to-many  -->
		<set name="students" table="teacher_student" cascade="all" inverse="false">
			<key column="teacher_id"/>
			<many-to-many column="student_id" class="Student" unique="true"/>
		</set>
		
	</class>
</hibernate-mapping>


<hibernate-mapping package="com.sh.study.model.o2n.TBrelated">
	<class name="Student" table="STUDENT">
		<id name="sid" type="java.lang.Integer" column="SID">
			<generator class="increment"/>
		</id> 
		<property name="sno" type="java.lang.String">
			<column name="SNO" />
		</property>
		<property name="name" type="java.lang.String">
			<column name="NAME" />
		</property>
		<property name="age" type="int">
			<column name="age" />
		</property>
	</class>
</hibernate-mapping>


test class
package com.sh.test.hibernate.o2n.tbrelated;

import java.util.Set;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.sh.study.model.o2n.TBrelated.Student;
import com.sh.study.model.o2n.TBrelated.Teacher;

//测试 Hibernate 单向 1:N
public class TestHibrO2N {
	private ApplicationContext act;
	private SessionFactory factory;
	@Before
	public void init(){
		act = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");
		factory= act.getBean("sessionFactory",SessionFactory.class);
	}
	@Test
	public void test1() {
		Session session=factory.getCurrentSession();
		Transaction tx=session.beginTransaction();
		
		Student s1=new Student();
		s1.setName("ann");
		s1.setAge(15);
		s1.setSno("s10121");
		
		
		Student s2=new Student();
		s1.setName("lili");
		s1.setAge(16);
		s1.setSno("s10122");
		
		
		Teacher t1=new Teacher();
		t1.setName("Lukuc");
		t1.setAge(26);
		t1.setSalary(1258.5);
		Set<Student> ss=t1.getStudents();
		ss.add(s1);
		ss.add(s2);
		
		
		//持久化对象
		session.persist(t1);
		//session.flush();
		tx.commit();
	
		//如果不是使用的SessionFactory.getSession()来获得Session。
		//而是使用SessionFactory.getCurrentSession()方法来获得Session时,
		//当事务结束的时候,不管是提交还是回滚事务,hibernate会自动关闭Session的,
		//session.close();
	}
	

}
  • 大小: 72.2 KB
  • 大小: 102.7 KB
  • 大小: 101.6 KB
分享到:
评论

相关推荐

    hibernate关联映射详解

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

    Hibernate 关联关系映射分类

    综上所述,Hibernate提供了丰富的关联关系映射机制,包括一对一、一对多和多对多关联,每种关联又可以细分为单向和双向,以及基于主键和基于外键的不同实现方式。正确理解和选择合适的关联关系对于构建高效、可维护...

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

    这个文件名暗示了这是一组基于Spring、Struts和Hibernate(简称S2SH)的示例代码,具体涉及的是关系映射中的一对一单向外键关联。"uni_fk"表示单向(unidirectional)外键(foreign key)关联。在数据库中,外键用于...

    Hibernate关联映射

    1. Hibernate 一对一外键单向关联: 在 Hibernate 中,一对一的外键单向关联意味着一个实体类中的属性指向另一个实体类,而另一个实体类并不知道这个关联。这种关联可以通过在 `many-to-one` 元素中添加 `unique=...

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

    “Hibernate基于外键的一对多单向关联”这个标题指的是在Java持久化框架Hibernate中,如何通过外键实现一个实体类(如订单)与另一个实体类(如商品)之间的一对多关系,并且这种关联是单向的,即从订单端可以访问到...

    Hibernate关联映射总结

    ### Hibernate关联映射总结 #### 一、基础知识 在探讨Hibernate中的关联映射之前,我们需要先理解几个基本概念,这将有助于我们更好地理解和应用这些关联映射。 - **主键**(Primary Key):主键是用来唯一标识一...

    hibernate实体关联关系映射

    实体关联关系映射是指在Hibernate框架下如何将Java对象之间的关联关系映射到数据库表中的过程。根据实体之间关联关系的不同,Hibernate提供了多种映射方式: 1. **一对一关联**(One-to-One) - 外键单向关联 - ...

    Hibernate关联映射-one to one单向外键关联

    本话题主要探讨的是Hibernate中的一种关联映射方式——一对一(One-to-One)单向外键关联。这种关联模式通常用于两个实体之间存在唯一对应的关系,例如一个用户对应一个唯一的账户。 在Hibernate中,一对一关联可以...

    hibernate的关联关系映射

    【hibernate的关联关系映射】在Java持久化框架Hibernate中,关联关系映射是核心功能之一,它允许对象间的复杂关系与数据库中的表结构相匹配。在选课系统这个例子中,主要涉及到的对象包括课题(Course)、教师(Teacher...

    Hibernate_实体关联关系映射--学习总结

    实体关联关系映射涉及一对一、一对多、多对多等多种形式,而这些映射方式又可以分为单向和双向,依据使用的是主键还是外键,以及是否使用连接表。接下来,我们详细介绍这些知识点。 ###Hibernate实体关联关系映射...

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

    本教程主要聚焦于Hibernate中的一个关键概念——关系映射,特别是多对一单向关联的实现。这种关联类型常出现在数据库设计中,比如一个部门可以有多名员工,但一个员工只属于一个部门。 首先,我们要理解多对一关系...

    Hibernate关联关系映射目录

    -- 映射关联PO,column是Address在该表中的外键列名,增加unique变成“1-1” --&gt; &lt;/hibernate-mapping&gt; ``` --- ##### 2. 一对一主键单向关联 在一对一主键单向关联中,两个实体共享同一个主键。这种方式通常...

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

    本练习主要关注的是Hibernate中的单向多对多关联映射,这是一种常见的关系数据库设计模式,用于表示两个实体间复杂的关系。 在多对多关联中,两个实体类可以相互拥有多个实例,但只在一个方向上建立关联。例如,...

    Hibernate基于连接表的一对多单向关联

    标题 "Hibernate基于连接表的一对多单向关联" 涉及的是数据库对象关系映射(ORM)框架Hibernate中的一个重要概念。在Java开发中,Hibernate是广泛使用的工具,它允许开发者将Java类与数据库表进行映射,简化了数据...

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

    本教程主要探讨的是Hibernate中的一种重要关系映射类型:一对多单向关联。在关系型数据库中,一对多关联是最常见的关系类型,一个实体可以与多个其他实体相关联。在Hibernate中,这种关系可以通过配置XML映射文件或...

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

    这篇博客文章“hibernate一对多关联映射(单向关联)”将深入讲解如何配置和使用这种映射关系。 在单向关联中,只有一个实体知道另一个实体的存在,也就是说,只有父实体("一"的一端)有对子实体("多"的一端)的...

    Hibernate映射关系大全

    6. **有连接表的 1:N 双向关联** 使用 `&lt;set&gt;` 和 `&lt;join&gt;` 标签在两边的实体映射文件中进行配置,同时指定 `inverse="true"` 表示关联的维护由另一方负责。 7. **基于主键的 1:1 (一对一) 关联映射** 这种关联...

    Hibernate教程06_关系映射之一对一单向主键关联

    这个文件名可能代表了一个基于Struts2、Spring和Hibernate(S2SH)的项目,其中"relation03"可能表示关系映射的第三部分,而"one2one_uni_pk"直指一对一单向主键关联的具体实现。 **详细知识点:** 1. **一对一...

    hibernate的关联映射

    在Hibernate中,关联映射是实现对象关系映射(ORM)的关键,它允许我们在对象模型和关系数据库之间建立联系。关联映射主要包括四种类型:一对一(One-to-One)、一对多(One-to-Many)、多对一(Many-to-One)和多对...

Global site tag (gtag.js) - Google Analytics