hibernate初探之一对多映射

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、注意关联的方向






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值