`
septem
  • 浏览: 54821 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Hibernate Session持久化方法实战

阅读更多
Hibernate Session中有一系列的持久化方法比如:save, update, saveOrUpdate, persist, merge, replicate等等,经常有人问起它们之间的细微差别,而Hibernate的官方文档并没有进行详细的说明,因此以几个测试用例验证它们的不同之外。文中所使用的持久化类以及配置请参考之前写的hibernate二级缓存

一、save, update, saveOrUpdate

这三个方法使用最为频繁,区别较直观,简单说一下

save:持久化对象,并根据ID生成策略分配ID

update(detachedInstance):根据detachedInstance的ID更新该对象,如果当前session中存在相同ID的persistent instance会抛异常

saveOrUpdate:根据对象ID的unsaved-value来决定是执行save还是update

代码:略

二、update, merge

merge(detachedInstance):merge方法会将detachedInstance的属性复制到相同ID的持久化对象,并返回该持久化对象。注意这里的detachedInstance本身并不会被持久化,继续保持游离状态,这是merge与update的最大区别

测试用例如下:
@Test
	public void test_update_merge(){
		Session session = sessionFactory.openSession();
		Author a1 = new Author();
		a1.setName("septem");
		session.save(a1);
		session.close();
		
		session = sessionFactory.openSession();
		a1.setName("septem_new");
		
		//Copy the state of a1 onto the persistent object a2
		Author a2 = (Author) session.merge(a1);
		//a1 doesn't become associated with the session
		assertFalse(session.contains(a1));
		
		assertEquals(a1.getName(), a2.getName());
		
		session.close();
	}


三、save, persist

persist与save不同的地方在于2点:
1.persist把对象进行持久化,但是不保证立刻生成ID,ID的生成可能被推迟到flush的时候

2.在transaction外部调用persist的时候并不触发sql Insert

测试用例如下:

@Test
	public void test_persist_outside_transaction(){
		Session session = sessionFactory.openSession();
		Author a1 = new Author();
		a1.setName("septem");
		//persist outside transaction
		session.persist(a1);
		//ID is NOT assigned
		assertNull(a1.getId());
		assertTrue(session.contains(a1));
		session.close();
		//hibernate doesn't execute INSERT statement
		assertNull(a1.getId());
	}


四、lock

lock(Object object, LockMode lockMode):lock方法根据LockMode获取相应的锁,并将对象持久化,它的主要作用是获取锁。

但是在实际测试的时候,发现如果对Author对象调用lock方法的时候会抛异常(org.hibernate.HibernateException: reassociated object has dirty collection reference),而在book对象上调用的时候则正常,猜测应该是author对象存在一对多的关系,包含了book集合,但具体原因还不清楚,有对hibernate熟悉的朋友请指点

测试用例如下:

@Test
	public void test_lock_author_throw_exception(){
		Session session = sessionFactory.openSession();
		Author a1 = new Author();
		a1.setName("septem");
		session.save(a1);
		session.close();
		
		session = sessionFactory.openSession();
		
		try {
			session.lock(a1, LockMode.NONE);
			fail("lock doesn't throw exception as expected");
		} catch (HibernateException e) {
			// org.hibernate.HibernateException: reassociated object has dirty collection reference
		}
		assertTrue(session.contains(a1));
		
		session.close();
	}
	
	@Test
	public void test_lock_book(){
		Session session = sessionFactory.openSession();
		Book book = new Book();
		book.setTitle("java");
		session.save(book);
		session.close();
		
		session = sessionFactory.openSession();
		
		session.lock(book, LockMode.NONE);
		// book is associated with the session	
		assertTrue(session.contains(book));
		
		session.close();
	}


五、replicate

replicate(Object object, ReplicationMode replicationMode):在ID是自动生成的情况下,save会持久化对象,并生动分配ID。而replicate同样是持久化对象,但它允许你指定ID。如果指定ID的纪录已经存在,它会根据参数ReplicationMode来决定是抛异常,还是覆盖原来的对象或者是直接忽略持久化操作

测试的时候,我指定了一个已经存在的ID进行replicate操作,ReplicationMode为ReplicationMode.EXCEPTION,实际的情况并没有抛出异常,而是直接生成是另外一个对象,ID为自动分配,相当于对transient instance调用save方法!google了一下,发现这个方法跟底层的数据与ID生成策略有关(参考这里),不同情况它的结果会不一样,所以在实践中还是应该慎用!

3
0
分享到:
评论

相关推荐

    精通Hibernate:Java对象持久化详解.zip

    3. **Session和Transaction管理**:讲解Hibernate的Session接口,它是与数据库交互的主要接口,负责对象的持久化操作。同时,还会涉及事务管理,包括如何开启、提交、回滚事务,确保数据的一致性。 4. **查询语言...

    Hibernate实战

    在本书中,作者详细介绍了Hibernate的核心概念、配置、实体管理、数据持久化、查询语言以及高级特性。 首先,我们要理解Hibernate的基本理念。ORM(Object-Relational Mapping)是将关系数据库的数据模型映射到面向...

    精通Hibernate:Java对象持久化技术详解.pdf

    《精通Hibernate:Java对象持久化技术详解》这本书深入剖析了Hibernate这一流行的Java对象关系映射(ORM)框架,旨在帮助开发者全面理解并熟练掌握Hibernate的使用。Hibernate是Java开发中的重要工具,它简化了...

    精通hibernate持久化对象技术.pdf

    ### 精通Hibernate持久化对象技术 #### Hibernate概述 Hibernate是一种开源的对象关系映射(Object Relational Mapping,ORM)框架,它为Java应用程序提供了一种简单、灵活的方式来与数据库进行交互。通过...

    Hibernate4实战.pdf

    Hibernate通过其核心接口Session, Transaction和Configuration等,为应用程序提供数据持久化服务。Session接口提供了基本的数据操作功能,比如保存、更新、删除和查询对象。Transaction接口用于管理事务,...

    精通HibernateJava对象持久化技术

    在对象持久化方面,书中涵盖了CRUD(创建、读取、更新和删除)操作的实现,包括使用HQL(Hibernate查询语言)和Criteria API进行复杂查询的方法。此外,还讨论了集合映射、多对一、一对一、一对多、多对多等各种关联...

    Hibernate实战(第2版).zip

    《Hibernate实战(第2版)》是一本深入探讨Java领域持久化框架Hibernate的专业书籍,针对Java开发者提供了详尽的Hibernate应用指南。这本书旨在帮助读者掌握如何有效地使用Hibernate进行数据库操作,提升开发效率,...

    Hibernate开发实战讲解(源代码)

    《Hibernate开发实战讲解》是一本深入探讨Java领域持久化框架Hibernate的教程,它结合实际案例,为开发者提供了详尽的源代码分析,旨在帮助读者掌握Hibernate的核心技术和实践应用。在这个压缩包中,我们期待找到一...

    Hibernate实战(第2版 中文高清版)

     第1章 理解对象/关系持久化   1.1 什么是持久化   1.1.1 关系数据库   1.1.2 理解SQL   1.1.3 在Java中使用SQL   1.1.4 面向对象应用程序中的持久化   1.2 范式不匹配   1.2.1 粒度问题   1.2.2 ...

    Hibernate开发实战源代码

    12. **实体生命周期**:熟悉Hibernate实体的瞬态(Transient)、持久化(Persistent)、托管(Managed)和游离(Detached)状态。 通过这个【UserHibernate】子文件夹,我们可以推测这可能包含了一个用户管理的示例...

    hibernate实战第二版.pdf

    1. **Hibernate基础**:介绍Hibernate的核心概念,包括实体类、持久化类、对象状态、持久化上下文(Session)以及Entity Manager。这部分将帮助读者理解如何将Java对象与数据库表对应起来。 2. **映射配置**:详细...

    hibernate实战 第2版.pdf

    3. 对象持久化:将应用程序中的Java对象通过session的save()或persist()方法保存到数据库中。 4. 数据查询:利用session提供的HQL(Hibernate Query Language)或Criteria查询接口来从数据库获取数据。 5. 数据...

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

    《精通 Hibernate:Java 对象持久化技术详解(第2版)》是一本深入解析Java对象持久化技术的权威著作,特别适合JavaWeb开发者学习。Hibernate作为Java领域中最流行的ORM(对象关系映射)框架,它简化了数据库操作,...

    Hibernate实战第2版.zip

    《Hibernate实战第2版》是IT领域中关于Java持久化框架Hibernate的一本深入实践的书籍。Hibernate是一个开源的ORM(对象关系映射)框架,它为Java开发者提供了在关系数据库和面向对象编程之间架起桥梁的工具。这本书...

    Hibernate4实战 之第七部分

    当需要持久化某些来自第三方库的Java类型时,如果这些类型没有提供适当的getter和setter方法,可以考虑实现`org.hibernate.UserType`接口来定义自定义类型。这样可以在不修改原有类的情况下完成持久化任务。 #### ...

    精通Hibernate:Java對象持久化技術詳解

    《精通Hibernate:Java對象持久化技術詳解》是一本深度解析Hibernate的教程,它旨在帮助Java开发者深入了解和掌握对象关系映射(ORM)技术,特别是通过Hibernate框架实现的持久化机制。Hibernate作为Java领域中广泛...

    Hibernate实战(第2版) 高清扫描版

    《Hibernate实战(第2版)》是一本深入探讨Java持久化框架Hibernate的专业书籍,高清扫描版使得读者可以清晰地获取书中的每一个细节。Hibernate作为Java领域最流行的ORM(对象关系映射)框架之一,它极大地简化了...

    Struts2+Spring+Hibernate框架技术与项目实战 源码(下).zip

    Struts2、Spring和Hibernate是Java Web开发中的三大主流框架,它们各自负责应用程序的不同层面:Struts2专注于表现层,Spring则在业务层提供服务,而Hibernate则在数据持久化层发挥重要作用。这个"Struts2+Spring+...

Global site tag (gtag.js) - Google Analytics