您的位置:首页 > 其它

Hibernate多对多单向关联(一个many-to-many)

2009-12-16 20:26 435 查看
一个学生可以有多个老师,一个老师也可以有多个学生,所以老师和学生之间的关系就是多对多的关系,这样就需要建立一个中间的关联表来存储关联信息。

-- Create table

create table TEACHER

(

ID NUMBER(4) not null,

NAME VARCHAR2(100),

SOURCENAME VARCHAR2(100)

)

-- Create table

create table STUDENT

(

ID NUMBER(4) not null,

NAME VARCHAR2(100),

AGE NUMBER(4),

SEX VARCHAR2(100)

)

-- Create table

create table STUTEA

(

STUDENT_ID NUMBER(4) not null,

TEACHER_ID NUMBER(4) not null

)

package com.pojo;
public class Student implements java.io.Serializable {
private Long id;
private String name;
private Long age;
private String sex;
public Student() {
}
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public Long getAge() {
return this.age;
}
public void setAge(Long age) {
this.age = age;
}
public String getSex() {
return this.sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}


package com.pojo;
import java.util.HashSet;
import java.util.Set;
public class Teacher implements java.io.Serializable {
private static final long serialVersionUID = -7640561034271065452L;
private Long id;
private String name;
private String sourcename;
//多对多单向关联
private Set<Student> students = new HashSet<Student>() ;
public Teacher() {
}
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public String getSourcename() {
return this.sourcename;
}
public void setSourcename(String sourcename) {
this.sourcename = sourcename;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
}


<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="com.pojo.Teacher" table="TEACHER" schema="ZM">
<id name="id" type="java.lang.Long">
<column name="ID" precision="4" scale="0" />
<generator class="increment" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" length="100" />
</property>
<property name="sourcename" type="java.lang.String">
<column name="SOURCENAME" length="100" />
</property>
<!--
多对多单向关联,table标识关联表,key里面column属性代表该类(Teacher)在关联表里面的键是teacher_id
many-to-many 里面class属性是set里面的类型,后面的column是指该类在关联表里面的外键
outer-join="true" 外连接
cascade="save-update" 级联操作
-->
<set name="students" table="stutea" outer-join="true" cascade="save-update">
<key column="teacher_id"></key>
<many-to-many class="com.pojo.Student" column="student_id"/>
</set>

</class>
</hibernate-mapping>


测试类:

package com.test;
import java.util.HashSet;
import java.util.Set;
import org.hibernate.Session;
import com.pojo.Card;
import com.pojo.Person;
import com.pojo.Student;
import com.pojo.Teacher;
import com.util.HibernateManager;
public class Test4 {
public static void main(String[] args) {
Test4.addPerson();
}
public static void addPerson() {
Session session = HibernateManager.openSession();
Student s1 = new Student();
Student s2 = new Student();
s1.setName("张三");
s1.setAge(new Long(20));
s1.setSex("男");
s2.setName("小丽");
s2.setAge(new Long(20));
s2.setSex("女");
Set<Student> set = new HashSet<Student>();
set.add(s1);
set.add(s2);
Teacher t = new Teacher();
t.setName("王老师");
t.setSourcename("语文");
t.setStudents(set);
try {
//只需要save teacher,因为设置了cascade="save-update" 级联操作
session.save(t);
HibernateManager.closeSession();
} catch (Exception e) {
e.printStackTrace();
HibernateManager.rollbackTransaction();
}
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: