`

hibernate的应用表之间的级联关系

阅读更多
1.联合主键映射
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--指定映射文件所在的包路径-->
<hibernate-mapping package="tarena.domain">
	<class name="Person" table="person">
<!--联合主键的配置-->
		<composite-id name="key" class="PersonKey">
			<key-property name="first" type="string">
				<column name="first"></column>
			</key-property>
			<key-property name="last" type="string">
				<column name="last"></column>
			</key-property>
		</composite-id>
		<property name="sex" type="string">
			<column name="sex"></column>
		</property>
	</class>
</hibernate-mapping>

pojo类实现,要有equals()和hashCode()方法
package tarena.domain;

public class Person {
	private PersonKey key;
	private String sex;
	public PersonKey getKey() {
		return key;
	}
	public void setKey(PersonKey key) {
		this.key = key;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	@Override
	public int hashCode() {
		final int PRIME = 31;
		int result = 1;
		result = PRIME * result + ((key == null) ? 0 : key.hashCode());
		result = PRIME * result + ((sex == null) ? 0 : sex.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		final Person other = (Person) obj;
		if (key == null) {
			if (other.key != null)
				return false;
		} else if (!key.equals(other.key))
			return false;
		if (sex == null) {
			if (other.sex != null)
				return false;
		} else if (!sex.equals(other.sex))
			return false;
		return true;
	}
}

PsersonKey类
package tarena.domain;

public class PersonKey implements java.io.Serializable{
	private String first;
	private String last;
	public PersonKey(){}
	public PersonKey(String first, String last) {
		super();
		this.first = first;
		this.last = last;
	}
	public String getFirst() {
		return first;
	}
	public void setFirst(String first) {
		this.first = first;
	}
	public String getLast() {
		return last;
	}
	public void setLast(String last) {
		this.last = last;
	}
}


2.外键,多对一/一对多
<!--Dept.hbm.xml-->
<hibernate-mapping package="tarena.domain">
	<class name="Dept" table="dept" lazy="true">
		<id name="id" type="integer">
			<column name="id"></column>
<!--id标识的生成策略,依赖于底层数据库的支持-->
			<generator class="native"></generator>
		</id>
		<property name="dname" type="string">
			<column name="dname"></column>
		</property>
<!--cascade="all"表示表示对象表之间的级联关系;one-to-many中级联的对象应由多(many)的一方来提供支持,many-to-many中可以是任意方-->
		<set name="emps" cascade="all" inverse="true">
			<key column="dept_id"></key>
			<one-to-many class="Emp"/>
		</set>
	</class>

<!--Emp.hbm.xml-->
<class name="Emp" table="emp">
		<id name="id" type="integer">
			<column name="id"></column>
			<generator class="native"></generator>
		</id>
		<property name="ename" type="string">
			<column name="ename"></column>
		</property>
<!--class对应的级联表对象,fetch="join"表示表与表之间的抓取策略-->
		<many-to-one name="dept" column="dept_id" class="Dept" fetch="join">
		</many-to-one>
	</class>
</hibernate-mapping>

测试类,具体实现在后面依次添加
public class DeptDAOTest {

DeptDAO deptDao;

	@Before
	public void init(){
		deptDao = new DeptDAO();
	}
//	@Test
	public void testAdd1(){
		Dept dept = new Dept();
		dept.setDname("testing");
		deptDao.add(dept);
	}
//	@Test
	//测试级联添加
	public void testAdd2(){
		Dept dept = new Dept();
		dept.setDname("design");
		//添加新员工designer1
		Set<Emp> emps = new HashSet<Emp>();
		Emp emp1 = new Emp();
		emp1.setEname("designer1");
		emp1.setDept(dept);
		emps.add(emp1);
		//	添加新员工designer2
		Emp emp2 = new Emp();
		emp2.setEname("designer2");
		emp2.setDept(dept);
		emps.add(emp2);

		//将员工集合emps指定给dept对象
		dept.setEmps(emps);
		deptDao.add(dept);
	}
	@Test
	//测试级联删除
	public void testDelete(){
		Dept dept = deptDao.findById(4);
		deptDao.delete(dept);
	}
//	@Test
	public void testFindById(){
		Dept dept = deptDao.findById(1);
		System.out.println(dept.getId()+":"+dept.getDname());
		Set<Emp> emps = dept.getEmps();
		for(Emp emp:emps){
			System.out.println(emp.getId()+":"+emp.getEname());
		}
		System.out.println("一共有"+emps.size()+"个员工");
	}
}

DeptDao代码
package tarena.dao;

import org.hibernate.Session;
import org.hibernate.Transaction;
import tarena.domain.Dept;
import tarena.util.HibernateUtil;

public class DeptDAO {
	public Dept findById(int id){
		Session session = HibernateUtil.getSession();
		Dept dept = (Dept)session.load(Dept.class, id);
		return dept;
	}
	public void add(Dept dept){
		Session session = HibernateUtil.getSession();
		Transaction txt = session.beginTransaction();
		session.save(dept);
		txt.commit();
		HibernateUtil.closeSession();
	}
	public void delete(Dept dept){
		Session session = HibernateUtil.getSession();
		Transaction txt = session.beginTransaction();
		session.delete(dept);
		txt.commit();
		HibernateUtil.closeSession();
	}
}


3.理解延迟加载,区分load和get方法
//load方法启用延迟加载,返回的对象是一个代理对象
//Dept dept = (Dept)session.load(Dept.class, 1);
//get方法不启用延迟加载,立刻检索数据表,返回对象实例
	Dept dept = (Dept)session.get(Dept.class, 1);
//HibernateUtil.closeSession();
//	如使用延迟加载,不要将session关闭,否则会影响后续取值操作
//可以在业务操作都完成后,再将session关闭。
//比如JavaWeb程序可以使用Filter控制session关闭
//hibernate的默认配置是启用延迟,所以在使用get方法时,
//可以Hibernate.initialize(obj),来对对象进行初始化加载,不过要在session.colse()之前
//或者可以把该对象的pojo类的映射文件的lazy="false",就可以了。


首先,配置hibernate.cfg.xml不过一般用于测试使用,项目开发可以使用第三方的管理配置
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>
	<session-factory>
		<property name="myeclipse.connection.profile">mysql</property>
		<property name="connection.username">root</property>
		<property name="connection.password">1234</property>
		<property name="connection.url">
			jdbc:mysql://localhost:3306/hibernate
		</property>
<!-- 是否使用数据库本地话方言   -->
		<property name="dialect">
			org.hibernate.dialect.MySQLDialect
		</property>
		<property name="connection.driver_class">
			com.mysql.jdbc.Driver
		</property>
<!-- 是否打印hql语句   -->
		<property name="show_sql">true</property>
<!-- 对象的关系映射   -->
		<mapping resource="tarena/mapping/Person.hbm.xml" />
		<mapping resource="tarena/mapping/Dept.hbm.xml" />
		<mapping resource="tarena/mapping/Emp.hbm.xml" />
	</session-factory>
</hibernate-configuration>

hibernateUtil的配置
package tarena.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {

	public static Configuration conf;
	public static SessionFactory sf;
	public static ThreadLocal<Session> sessionLocal = new ThreadLocal<Session>();

	static{
		conf = new Configuration();
		conf.configure();//默认加载src下面的hibernate.cfg.xml配置文件
		sf = conf.buildSessionFactory();
	}

	public static Session getSession() {
		Session session = sessionLocal.get();
		if(session == null){
			session = sf.openSession();
			sessionLocal.set(session);
		}
		return session;
	}

	public static void closeSession(){
		Session session = sessionLocal.get();
		sessionLocal.set(null);
		if(session != null){
			session.close();
		}
	}
}

pojo类Dept
package tarena.domain;
import java.io.Serializable;
import java.util.Set;

public class Dept implements Serializable{
	private int id;
	private String dname;
	private Set<Emp> emps;

	public String getDname() {
		return dname;
	}
	public void setDname(String dname) {
		this.dname = dname;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public Set<Emp> getEmps() {
		return emps;
	}
	public void setEmps(Set<Emp> emps) {
		this.emps = emps;
	}
}
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    精通hibernate:对象持久化技术孙卫琴第二版part2

    第3章 第一个Hibernate应用 47 本章通过简单的helloapp应用例子,演示如何利用Hibernate来持久化Java对象。 3.1 创建Hibernate的配置文件 47 3.2 创建持久化类 48 3.3 创建数据库Schema 51 3.4 创建对象-关系...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

    第3章 第一个Hibernate应用  3.1 创建Hibernate的配置文件  3.2 创建持久化类  3.3 创建数据库Schema  3.4 创建对象-关系映射文件  3.4.1 映射文件的文档类型定义(DTD)  3.4.2 把Customer持久化类映射到...

    精通Hibernate:对象持久化技术第二版part3

    第3章 第一个Hibernate应用 47 本章通过简单的helloapp应用例子,演示如何利用Hibernate来持久化Java对象。 3.1 创建Hibernate的配置文件 47 3.2 创建持久化类 48 3.3 创建数据库Schema 51 3.4 创建对象-关系...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

    第3章 第一个Hibernate应用  3.1 创建Hibernate的配置文件  3.2 创建持久化类  3.3 创建数据库Schema  3.4 创建对象-关系映射文件  3.4.1 映射文件的文档类型定义(DTD)  3.4.2 把Customer持久化类映射到...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

    第3章 第一个Hibernate应用  3.1 创建Hibernate的配置文件  3.2 创建持久化类  3.3 创建数据库Schema  3.4 创建对象-关系映射文件  3.4.1 映射文件的文档类型定义(DTD)  3.4.2 把Customer持久化类映射到...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

    第3章 第一个Hibernate应用  3.1 创建Hibernate的配置文件  3.2 创建持久化类  3.3 创建数据库Schema  3.4 创建对象-关系映射文件  3.4.1 映射文件的文档类型定义(DTD)  3.4.2 把Customer持久化类映射到...

    Hibernate注释大全收藏

    • Single Table per Class Hierarchy Strategy: the &lt;subclass&gt; element in Hibernate 每个类层次结构一张表 • Joined Subclass Strategy: the &lt;joined-subclass&gt; element in Hibernate 连接的子类策略 @...

    hibernate总结

    持久化类的对象,在hibernate应用中可以处于三种状态(根据对象和session之间的关系进行划分): 1. 临时态,瞬态:特点: a) 在数据库中没有记录和它对应 b) 和session没有任何关系 c) New 出来的对象,都处于临时...

    Spring3.x企业应用开发实战(完整版) part1

    4.6 之间的关系 4.6.1 继承 4.6.2 依赖 4.6.3 引用 4.7 整合多个配置文件 4.8 Bean作用域 4.8.1 singleton作用域 4.8.2 prototype作用域 4.8.3 Web应用环境相关的Bean作用域 4.8.4 作用域依赖问题 4.9 FactoryBean ...

    Spring.3.x企业应用开发实战(完整版).part2

    4.6 之间的关系 4.6.1 继承 4.6.2 依赖 4.6.3 引用 4.7 整合多个配置文件 4.8 Bean作用域 4.8.1 singleton作用域 4.8.2 prototype作用域 4.8.3 Web应用环境相关的Bean作用域 4.8.4 作用域依赖问题 4.9 FactoryBean ...

    jdbc基础和参考

    ORM:使用元数据信息来描述对象和数据库之间的关系,并且能够自动实现java中持久化对象到关系型数据库中表的映射 脏检查:自动对缓存中的数据进行检查,并且选择在合适的时机和数据库之间进行交互,以保持数据的...

    bankingSpringBootAPI:在MongoDB中具有数据持久性的示例Spring Boot Web API项目

    只有Customer对象保留了该关系的引用-即使MongoDB没有明确的级联,关系也正在级联功能性Project正在公开一个简单的银行REST API,用于客户和帐户管理。 它响应以下操作: GET / customers-使用分配的帐户与所有客户...

    千方百计笔试题大全

    98、Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系) 22 99、说下Hibernate的缓存机制 22 100、Hibernate的查询方式 23 101、如何优化Hibernate? 23 102、Struts工作机制?为什么要使用Struts? 23 ...

    java面试宝典

    98、Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系) 22 99、说下Hibernate的缓存机制 22 100、Hibernate的查询方式 23 101、如何优化Hibernate? 23 102、Struts工作机制?为什么要使用Struts? 23 ...

    支持多数据库的ORM框架ef-orm.zip

    表结构元数据的API也向用户开放,同时支持在使用过程中,灵活调整映射关系,因此用户可以用API动态的创建表结构的模型,从而实现各种动态类型和表的映射(例如POJO中包含一个Map,用于映射各种动态扩展的字段)企业...

Global site tag (gtag.js) - Google Analytics