hibernate第二章:关联映射

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设置关联字段是否威为空Nfalse
lazy加载策略Nproxy
fetcj抓取策略Nselect


测试:插入数据:

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指定关联对象是否使用延迟加载策略Nproxy
fetch抓取策略Nselect

 

学生类: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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wiksys

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值