基于中间表关联的单向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
teacher
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: 基于中间表管理
student

teacher

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();
}
}