正如上篇【Hibernate】——多对一映射 所说,一对多映射是多对一的反例,一个班有多个学生,这就是一种
一对多的体现。如图所示:
建立Class实体类,在Class建立Student的集合关系:
package com.bjpowernode.hibernate;
import java.util.Set;
/**
* 建立Class实体类
* @author why_768
*
*/
public class Class {
private int id;
private String name;
private Set students;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set getStudents() {
return students;
}
public void setStudents(Set students) {
this.students = students;
}
}
class实体映射文件配置,在set标签里设置class与student的一对多关系,并且在t_student里添加外键 classid:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.bjpowernode.hibernate.Class" table="t_class">
<id name="id">
<!-- 采用foreign生成策略,会取得关联对象的标识 -->
<generator class="native" />
</id>
<property name="name"/>
<set name="students">
<key column="classid"/>
<one-to-many class="com.bjpowernode.hibernate.Student"/>
</set>
</class>
</hibernate-mapping>
新建student实体对象:
package com.bjpowernode.hibernate;
public class Student {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
配置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">
<hibernate-mapping>
<class name="com.bjpowernode.hibernate.Student" table="t_student">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>
</hibernate-mapping>
配置完成了,新建数据库,生成数据库表。建立一个Junit测试类,保存一条数据:
public void testSave1(){
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
Student student1 = new Student();
student1.setName("Yana");
session.save(student1);
Student student2 = new Student();
student2.setName("ZJ");
session.save(student2);
Class class1 = new Class();
class1.setName("一班");
Set students = new HashSet();
students.add(student1);
students.add(student2);
class1.setStudents(students);
session.save(class1);
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally{
HibernateUtils.closeSession(session);
}
}
数据已经保存到数据库了:
这就是一对多映射的单向映射,有单向映射,当然也有双向映射咯。双向映射也很简单,只需要在Student实
体类里添加属性Class:
package com.bjpowernode.hibernate;
public class Student {
private int id;
private String name;
private Class class1;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Class getClass1() {
return class1;
}
public void setClass1(Class class1) {
this.class1 = class1;
}
}
然后在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">
<hibernate-mapping>
<class name="com.bjpowernode.hibernate.Student" table="t_student">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<many-to-one name="class1" column="classid"/>
</class>
</hibernate-mapping>
基本设置就完成了,这样无论通过Student还是Class都能保存和查询数据了。至于数据库中字段classid的维
护,如果需要让Student进行维护,只需要在Class.hbm.xml映射文件里配置inverse属性:
<!-- inverse=“true”影响存储管理,只能由一的一方进行管理 -->
<set name="students" inverse="true">
<key column="classid"/>
<one-to-many class="com.bjpowernode.hibernate.Student"/>
</set>
inverse用在一个对多和多对多双向关联上,主要影响存储管理,如果inverse=“true”,本端不能维护,会交给
另一端维护。
一对多映射讲到这里,下篇主要讲一对一映射关系。