基于中間表關聯的單向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(); } }
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
