Hibernate 关系映射(6) 基于中间表关联的单向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]
中间表
[img]http://dl2.iteye.com/upload/attachment/0103/0125/1be3884b-94f5-3d26-b454-d02a1a19cc90.jpg[/img]

Teacher

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

Student

[img]http://dl2.iteye.com/upload/attachment/0103/0129/b78b6fd1-9b29-348b-888a-6e42f29cc83c.jpg[/img]



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


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值