1、many-to-one
本来打算写完的,可是看看只能先写单向一对多,和单向多对一了。抱歉了。
在第一章,我们对Hibernate有了一个感性的认识。知道了实体对象的生命周期。
http://blog.youkuaiyun.com/wiksys/article/details/7934380
在本章中,我们将会学习对象间的关联关系。
首先回忆下。我们在数据库中是怎么处理关联关系的,外键(Primary key)!对了,就是外键。那怎样将面向对象和数据库关系模型建立关系呢?带这这个问题,我们开始这一章。
在学习关联关系前,我们先了解下实体间的关系?
关联关系:通过一个对象持有另一个对象的实例来实现的
泛化关系:通过对象之间的继承方法来实现。
小经验:关联关系是对象关系映射的一个重要特征,但是会造成性能底下。所以设计的时候要注意。
Many-to-one:单向一对多关联
案例:学生和宿舍
多个学生一个宿舍:多对一。
类图
我们练习的是向表中插入一条宿舍记录,再在这个宿舍记录中添加一条学生记录。
SQL脚本
create table dorm(
id number primary key,
name varchar2(20) not null
);
Create table student(
id number primary key,
dorm_id number,
name varchar2(20) not null,
foreign key(dorm_id) references dorm(id)
);
create sequence hibernate_sequence start with 1;
insert into dorm values(hibernate_sequence.nextval,'101');
insert into dorm values(hibernate_sequence.nextval,'102');
insert into student values(hibernate_sequence.nextval,21,'wiksys');
commit;
实体类:宿舍:(Dorm.java)
package org.wiksys.chap02.bean;
/**
* 宿舍表
* @author wiksys
*
*/
public class Dorm implements java.io.Serializable{
private Long id;
private String name;
public Long getId() {
return id;
}
/**
* setter和getter....
*/
}
映射文件:Dorm.hbm.xml
<?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="org.wiksys.chap02.bean.Dorm" table="dorm">
<id name="id" type="java.lang.Long">
<column name="id"></column>
<generator class="sequence">
<!-- 不写值则用公共的序列,在这里就写上。 -->
<param name="sequence">hibernate_sequence</param>
</generator>
</id>
<property name="name" type="java.lang.String">
<column name="name"/>
</property>
</class>
</hibernate-mapping>
实体类:学生:(Student.java)
package org.wiksys.chap02.bean;
/**
* 学生类
* @author wiksys
*
*/
public class Student implements java.io.Serializable{
private Long id;
private Dorm dorm;
private String name;
/**
* setter和getter
*/
}
映射文件:Student.hbm.xml
<?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="org.wiksys.chap02.bean.Student" table="student">
<id name="id" type="java.lang.Long">
<column name="id" />
<generator class="sequence">
<param name="sequence">hibernate_sequence</param>
</generator>
</id>
<!-- 配置many-to-one -->
<many-to-one name="dorm" class="org.wiksys.chap02.bean.Dorm">
<column name="dorm_id" />
</many-to-one>
<property name="name" type="java.lang.String">
<column name="name"></column>
</property>
</class>
</hibernate-mapping>
many-to-one元素常用属性:
属性 | 含义和作用 | 是否必须 | 默认值 |
name | 映射类属性的名称 | Y | |
class | 关联类的完全限定名 | N | |
column | 关联的字段 | N | |
not-null | 设置关联字段是否威为空 | N | false |
lazy | 加载策略 | N | proxy |
fetcj | 抓取策略 | N | select |
测试:插入数据:
package org.wiksys.chap02.test;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.wiksys.chap02.bean.Dorm;
import org.wiksys.chap02.bean.Student;
public class HibernateTest {
/**
* @author wiksys
* @return 测试
* @param args
*/
public static void main(String[] args) {
Student student=new Student();
Dorm dorm=new Dorm();
dorm.setName("104");
student.setName("jerry");
student.setDorm(dorm);
SessionFactory sf=null;
Session session=null;
Transaction tx=null;
try {
sf=new Configuration().configure().buildSessionFactory();
session=sf.openSession();
tx=session.beginTransaction();
session.save(dorm);
session.save(student);
tx.commit();
} catch (HibernateException e) {
tx.rollback();
e.printStackTrace();
} finally {
session.close();
sf.close();
}
}
}
2、ont-to-many
One-to-many:单向多对一关联
案例:宿舍和学生
一个宿舍多个学生
就是多对一反过来。同样练习添加一条记录
SQL脚本,和上面的一样
宿舍类:Dorm.java
package org.wiksys.chap02.bean2;
import java.util.HashSet;
import java.util.Set;
/**
* 宿舍表
* @author wiksys
*
*/
public class Dorm implements java.io.Serializable{
private Long id;
private String name;
//集合形式保存
private Set<Student> students=new HashSet<Student>();
/**
* setter和getter
*/
}
映射文件:Dorm.hbm.xml
<?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="org.wiksys.chap02.bean2.Dorm" table="dorm">
<id name="id" type="java.lang.Long">
<column name="id"></column>
<generator class="sequence">
<!-- 不写值则用公共的序列,在这里就写上。 -->
<param name="sequence">hibernate_sequence</param>
</generator>
</id>
<property name="name" type="java.lang.String">
<column name="name"/>
</property>
<set name="students" table="student">
<key>
<column name="dorm_id" />
</key>
<one-to-many class="org.wiksys.chap02.bean2.Student"/>
</set>
</class>
</hibernate-mapping>
one-to-many中的set属性
属性 | 含义和定义 | 必须 | 默认值 |
name | 映射文件属性的名称 | Y | |
table | 关联类的目标数据库表 | Y | |
lazy | 指定关联对象是否使用延迟加载策略 | N | proxy |
fetch | 抓取策略 | N | select |
学生类:Student.java
package org.wiksys.chap02.bean2;
/**
* 学生表
* @author wiksys
*
*/
public class Student implements java.io.Serializable{
private Long id;
private Long dormId;
private String name;
/**
* setter和getter
*/
}
映射文件:Student.hbm.xml
<?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="org.wiksys.chap02.bean2.Student" table="student">
<id name="id" type="java.lang.Long">
<column name="id" />
<generator class="sequence">
<param name="sequence">hibernate_sequence</param>
</generator>
</id>
<property name="dormId">
<column name="dorm_id" />
</property>
<property name="name" type="java.lang.String">
<column name="name"></column>
</property>
</class>
</hibernate-mapping>
对了,还有必须的在hibernate.cfg.xml中注册下映射文件:
<!-- 第二章 多对一-->
<!--
<mapping resource="org/wiksys/chap02/bean/Dorm.hbm.xml"/>
<mapping resource="org/wiksys/chap02/bean/Student.hbm.xml"/>
-->
<!-- 第二章 一对多-->
<mapping resource="org/wiksys/chap02/bean2/Dorm.hbm.xml"/>
<mapping resource="org/wiksys/chap02/bean2/Student.hbm.xml"/>
测试一对多:
package org.wiksys.chap02.test;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.wiksys.chap02.bean2.Dorm;
import org.wiksys.chap02.bean2.Student;
public class HibernateTest2 {
/**
* @author wiksys
* @return 测试
* @param args
*/
public static void main(String[] args) {
Student student=new Student();
student.setName("jerry");
Dorm dorm = new Dorm();
dorm.setName("104");
dorm.getStudents().add(student);
SessionFactory sf=null;
Session session=null;
Transaction tx=null;
try {
sf=new Configuration().configure().buildSessionFactory();
session=sf.openSession();
tx=session.beginTransaction();
session.save(dorm);
session.save(student);
tx.commit();
} catch (HibernateException e) {
tx.rollback();
e.printStackTrace();
} finally {
session.close();
sf.close();
}
}
}
源码:http://download.youkuaiyun.com/detail/wiksys/4545505
相关的jar文件: http://download.youkuaiyun.com/detail/wiksys/4545524