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

[size=medium][b]基于中间表关联的单向1:N[/b]
单向 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: 基于中间表管理
[/size]

student

[img]http://dl2.iteye.com/upload/attachment/0103/0131/a2c511b2-4edb-349b-9c05-71ff2fc8c190.jpg[/img]

teacher
[img]http://dl2.iteye.com/upload/attachment/0103/0127/3a2321d7-cecb-3cf7-95f1-fe63efb33eb2.jpg[/img]



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


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值