多对一关系:多个学生对应一个老师
多方类中存在一方类的变量,一方类中或许会有多方类的集合变量.
首先看cascade写在哪一方,那一方有主动权
本例在student(多方...)
在多方增加数据时(一方已经存在),例如:Teacher teacher= (Teacher)session.load(Teacher.class,"005");得到老师后,在用
student.setTeacher(teacher);session.save(student);
如果新建一个一方,那么则new一个teacher();最终student.setTeacher(teacher);session.save(student);同时也会新增teacher
学生类Student
package com.pojo;
/**
* Student generated by MyEclipse Persistence Tools
*/
public class Student implements java.io.Serializable {
// Fields
private Integer id;
private Teacher teacher;
private String sname;
// Constructors
/** default constructor */
public Student() {
}
/** full constructor */
public Student(Teacher teacher, String sname) {
this.teacher = teacher;
this.sname = sname;
}
// Property accessors
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
public Teacher getTeacher() {
return this.teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
public String getSname() {
return this.sname;
}
public void setSname(String sname) {
this.sname = sname;
}
}
老师实体类Teacher
package com.pojo;
import java.util.Set;
/**
* Teacher generated by MyEclipse Persistence Tools
*/
public class Teacher implements java.io.Serializable {
// Fields
private Integer id;
private String tname;
// Constructors
/** default constructor */
public Teacher() {
}
/** minimal constructor */
public Teacher(String tname) {
this.tname = tname;
}
/** full constructor */
public Teacher(String tname, Set students) {
this.tname = tname;
this.students = students;
}
// Property accessors
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTname() {
return this.tname;
}
public void setTname(String tname) {
this.tname = tname;
}
}
以上程序中Teacher类已经是Student类一个属性
Teather映射文件
<?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="dbo" catalog="users">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="native" />
</id>
<property name="tname" type="java.lang.String">
<column name="tname" length="50" not-null="true" />
</property>
</class>
</hibernate-mapping>
Student映射文件
<?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.Student" table="student" schema="dbo" catalog="users">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="native" />
</id>
<many-to-one name="teacher" class="com.pojo.Teacher" fetch="select" cascade="save-update" lazy="false">
<column name="tid" not-null="true" />
</many-to-one>
<property name="sname" type="java.lang.String">
<column name="sname" length="50" not-null="true" />
</property>
</class>
</hibernate-mapping>
其中:
<many-to-one name="teacher" class="com.pojo.Teacher" fetch="select" cascade="save-update" lazy="false">
<column name="tid" not-null="true" />
</many-to-one>
表示两个表之间的逻辑关系是多对一关系。
测试多对一的关系
//添加操作
public void Save() {
// TODO Auto-generated method stub
Transaction tx=null;
//开启Session
Session session =HibernateSessionFactory.getSession();
try
{
//开启事务
tx=session.beginTransaction();
//持久化完成
Student st=new Student();
Teacher th=new Teacher();
th.setTname("教师1");
st.setSname("学生1");
st.setTeacher(th);
session.save(st);
//事务提交
tx.commit();
}
catch(Exception ex)
{
ex.printStackTrace();
//事务回滚
if(tx!=null)
{
tx.rollback();
}
}
}