基于中间表关联的单向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
test class
单向 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(); } }