Hibernate映射关系其实有很多种,包含一对一,一对多,多对一,多对多。其中,还有包含单向关联,多想关联。但是鉴于时空关系,本文只谈一下单向一对多关系的映射。而多对一进行反向思维就是一对多。
如何确定一个映射关系:
这个取决于需求,比如,你的师生管理项目中,客户已经明确规定,在这个项目中,老师可以教多个学生,学生也可以有多个老师,这很明显是m:n就是多对多的关系。如果说做部门与员工这样的表,那么一个部门可以有多个员工,但是,每个员工只能在一个部门工作,这就是一个1:M一对多的关系。到底要用哪种关系,取决于你对客户需求的理解 。
正文
这里我所写的是一个班级对应着多个学生。
一对多的映射关系:
类的设定:在多对一的关系中,多的哪一方属于归属方,而少的那一方属于被归属方。(归属方归属于被归属方)在设定类中的内容的时候,一的那一方除了有自己特有的属性意外,还应该将多的那一方的Set集合写进一的那一方的类中。而多的那一方,应该将一的那一方的对象写在自己的类的属性中,表示自己归属于这个类。
如:
Classes.java
package com.zhiyou.hibernate.entity;
import java.util.HashSet;
import java.util.Set;
public class Classes {
/* 这里我只写了属性,并没有写set和get方法。IDE工具可以自动生成*/
private int id;
private String name;
// 一对多通常使用Set来映射,Set是不可重复内容。
private Set<Student> students = new HashSet<Student>();
}
Student.java
/* 这里我只写了属性,并没有写set和get方法。IDE工具可以自动生成*/
private int id;
private String name;
private Classes classes;
处理完class类,就需要配置与Class类对应的hub的xml文件。
在Hibernate中所有的实体类都对应着一个hub配置文件。
而hub配置文件同时又关联着数据库表。
classes.hub.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.zhiyou.hibernate.entity">
<class name="Classes" table="t_classess">
<id name="id" column="id">
<!-- 这个表示主键的生成方式
http://blog.csdn.net/zxygww/article/details/45194445
-->
<generator class="native"/>
</id>
<property name="name" column="name"></property>
<!-- 设置Set集合属性,用于关联多个学生 -->
<set name="students" >
<!-- 在t_student表中创建外键classid,与本表的id对应 -->
<key column="classesid" />
<!--
<one-to-many>
<many-to-one>
的选择取决于当前类与指向类的关系,如果当前为一对多中的一,那么应当选择<one-to-many>
如果当前是一对多种的多那么当选择<many-to-one>,当然如果是单向关联,那么就无需写此标签
http://blog.csdn.net/xiaoxian8023/article/details/15339657
-->
<one-to-many class="Student"/>
</set>
</class>
</hibernate-mapping>
student.hub.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.zhiyou.hibernate.entity.Student" table="t_student">
<id name="id" column="id">
<generator class="native"/>
</id>
<property name="name" column="name"/>
</class>
</hibernate-mapping>