Hibernate 关系映射(7) 基于外键关联的单向1:N

系统 1688 0
基于中间表关联的单向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: 基于中间表管理


student

Hibernate 关系映射(7) 基于外键关联的单向1:N

teacher
Hibernate 关系映射(7) 基于外键关联的单向1:N



    
public class Student {

	private Integer sid;
	private String sno;
	private String name;
	private int age;
	private Integer tid;

//...
}
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;

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

	DROP TABLE IF EXISTS mytest.student;

DROP TABLE IF EXISTS mytest.student;

CREATE TABLE mytest.student
	(
	SID  INT NOT NULL,
	SNO  VARCHAR (255),
	NAME VARCHAR (255),
	age  INT,
	tid  INT,
	PRIMARY KEY (SID),
	KEY FKBACA0E1B1429B970 (tid),
	CONSTRAINT FKBACA0E1B1429B970 FOREIGN KEY (tid) REFERENCES teacher (TID)
	);

  


    
<hibernate-mapping package="com.sh.study.model.o2n.FKrelated">
	<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  注意这里故意 改成 students1 为了证明这里是根据 set get后面的方法名字进行映射-->
		<set name="students1" cascade="all">
			<key column="tid"/>
			<one-to-many class="Student"/>
		</set>
	</class>
</hibernate-mapping>

<hibernate-mapping package="com.sh.study.model.o2n.FKrelated">
	<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>
		<property name="tid" type="java.lang.Integer">
			<column name="TID" />
		</property>
	</class>
</hibernate-mapping>

  


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

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.FKrelated.Student;
import com.sh.study.model.o2n.FKrelated.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);
		t1.getStudents1().add(s1);
		t1.getStudents1().add(s2);
		
		//持久化对象
		session.persist(t1);
		session.flush();
		tx.commit();
	
		//如果不是使用的SessionFactory.getSession()来获得Session。
		//而是使用SessionFactory.getCurrentSession()方法来获得Session时,
		//当事务结束的时候,不管是提交还是回滚事务,hibernate会自动关闭Session的,
		//session.close();
	}
	

}


  

Hibernate 关系映射(7) 基于外键关联的单向1:N


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论