基于中間表關聯的單向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();
}
}
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

