1、映射类型
一对多(one-to-many)
多对一(many-to-one)
一对一(one-to-one)
多对多(many-to-many)
2、一对多关联
如下图的班级与学生的一对多的关系
在数据库中,可以通过添加主外键的关联,表现一对多的关系。
在hibernate中通过在一方持有多方的集合实现,即在“一”的一端中使用<set>元素表示持有“多”的一端的对象
测试用例如下所示:
hibernate.cfg.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.username">root</property>
<property name="connection.password">123</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">
jdbc:mysql:///hibernate?userUnicode=true&characterEncoding=UTF-8
</property>
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="hbm2ddl.auto">create</property>
<mapping resource="hibernate/Grade.hbm.xml"/>
<mapping resource="hibernate/Student.hbm.xml"/>
</session-factory>
</hibernate-configuration>
student类
package hibernate;
import java.io.Serializable;
public class Student implements Serializable{
private int sid;
private String sname;
private String sex;
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Student [sid=" + sid + ", sname=" + sname + ", sex=" + sex + "]";
}
public Student(String sname, String sex) {
super();
this.sname = sname;
this.sex = sex;
}
public Student() {
super();
}
}
Grade班级类
package hibernate;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
public class Grade implements Serializable{
private int gid;
private String gname;
private String gdesc;//班级对应的详细信息
//在以防定义一个多方的集合
private Set<Student> students = new HashSet<Student>();//一定要注意初始化不然会报空指针异常错误
public int getGid() {
return gid;
}
public void setGid(int gid) {
this.gid = gid;
}
public String getGname() {
return gname;
}
public void setGname(String gname) {
this.gname = gname;
}
public String getGdesc() {
return gdesc;
}
public void setGdesc(String gdesc) {
this.gdesc = gdesc;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
public Grade(int gid, String gname, String gdesc, Set<Student> students) {
super();
this.gid = gid;
this.gname = gname;
this.gdesc = gdesc;
this.students = students;
}
public Grade() {
super();
}
public Grade(String gname, String gdesc) {
super();
this.gname = gname;
this.gdesc = gdesc;
}
}
student持久化映射文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-2-1 21:04:47 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="hibernate.Student" table="STUDENT"><!--注意一定要与所处包名相同,不然会报初始化出错-->
<id name="sid" type="int">
<column name="SID" />
<generator class="native" />
</id>
<property name="sname" type="java.lang.String">
<column name="SNAME" length="20" not-null="true"/>
</property>
<property name="sex" type="java.lang.String">
<column name="SEX" />
</property>
</class>
</hibernate-mapping>
grade持久化映射文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-2-1 21:04:47 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="hibernate.Grade" table="GRADE">
<id name="gid" column="gid" type="java.lang.Integer">
<generator class="native"/>
</id>
<property name="gname" type="java.lang.String">
<column name="gname" length="20" not-null="true"></column>
</property>
<property name="gdesc" type="java.lang.String">
<column name="gdesc"></column>
</property>
<!-- 配置单向的一对多关联关系-->
<set name="students" table="STUDENT">
<!-- 指定关联的外键列 -->
<key column="gid"></key>
<one-to-many class="hibernate.Student"/><!--一定要与所处包名相同不然会报映射文件出错-->
</set>
</class>
</hibernate-mapping>
测试文件
package test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.Test;
import hibernate.Grade;
import hibernate.Student;
/**
* 单向一对多关系(班级--->学生)
* @author Administrator
*
*/
public class TestManyToOne {
//将学生添加到班级
@Test
public void TestAddStudentToClass()
{
//创建Configuration对象,读取hibernate.cfg.xml文件,完成初始化
Configuration configuration=new Configuration().configure();
//创建服务注册对象
ServiceRegistry serviceRegistry= new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
//创建会话工厂对象
SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
//会话对象
Session session = sessionFactory.openSession();
//开启事务
Transaction tx= session.beginTransaction();
Grade g =new Grade("Java2班", "Java分类的班级");
Student s= new Student("xqh", "女");
Student s1= new Student("txr", "女");
Student s2=new Student("sn","女");
Student s3 =new Student("pha","男");
Student s4 =new Student("lyh","男");
Student s5=new Student("zzc","男");
g.getStudents().add(s);
g.getStudents().add(s1);
g.getStudents().add(s2);
g.getStudents().add(s3);
g.getStudents().add(s4);
g.getStudents().add(s5);
session.save(g);
session.save(s);
session.save(s1);
session.save(s2);
session.save(s3);
session.save(s4);
session.save(s5);
tx.commit();
session.close();
}
}
测试运行最后通过,途中所报错误用红色标记了。
注意:1、查询的时候要将hibernate.cfg.xml中的create改为update
2、注意关联的方向