`
hejiajunsh
  • 浏览: 410840 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

Hibernate之session

阅读更多

Hibernate在对资料库进行操作之前,必须先取得Session实例,相当于JDBC在对资料库操作之前,必须先取得Connection实例, Session是Hibernate操作的基础,它不是设计为执行绪安全(Thread-safe),一个Session由一个执行绪来使用。

  • 开启Session
Session实例由SessionFactory开启获得,例如:
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
....
tx.commit();
session.close();

开 启Session不会马上取得Connection,而是在最后真正需要连接资料库进行更新或查询时才会取得Connection,如果有设定 Connection pool,则从Connection pool中取得Connection,而关闭Session时,如果有设定Connection pool,则是将Connection归还给Connection pool,而不是直接关闭Connection。

在Hibernate中,开启一个Session会建立一个Persistence context,它可以进行快取管理、dirty check等,而所有的读取、更新、插入等动作,则是在Transaction中完成。

 

  • 储存资料
透过Session,可以对资料库进行新增、删除、更新,例如使用save()新增一笔资料:
User user = new User(); 
user.setName("momor"); 
user.setAge(new Integer(26));

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
session.save(user); 
tx.commit();
session.close();

save() 之后,不会马上对资料库进行更新,而是在Transaction的commit()之后才会对资料库进行更新,在Transaction之间的操作要就全 部成功,要就全部失败,如果更新失败,则在资料库层面会撤消所有更新操作,然而记忆体中的持久物件是不会回复原有状态的,事实上,当 Transaction失败,这一次的Session就要马上跟着失效,放弃所有记忆体中的物件,而不是尝试以原物件再进行更新的动作。

 

  • 取得资料
您使用get()或load()方法取得id为1的资料:
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
User user = (User) session.get(User.class, new Integer(1));
tx.commit();
session.close();

如果未能发现相符合的资料,则get()方法会返回null,而load()方法会丢出ObjectNotFoundException,在进阶的应用中,load()方法可以返回代理(proxy)物件,在必要时才真正查询资料库取得对应资料,并可充分利用快取机制。

在Hibernate 3中,取消了find()方法,您必须透过Query或Criteria来进行资料查询。

 

  • 删除资料
接下来看看使用Session删除资料,可使用delete()删除资料:
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
User user = (User) session.get(User.class, new Integer(1));
session.delete(user);
tx.commit();
session.close();
  • 更新资料
当您在同一个Session中取出资料并封装为Persistence Object,接着更新物件状态,而后将Transaction commit,则物件上的状态更新将反应至资料库中,您无需额外进行任何的更新操作。

如果您开启了一个Session,从资料表中取出资料显示到使用者介面上,之后关闭Session,当使用者在介面上操作完毕并按下储存时,这时您要重新开启一个Session,使用update()方法将物件中的资料更新至对应的资料表中:

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
User user = (User) session.get(User.class, new Integer(2));
tx.commit();
session.close();
....
user.setAge(new Integer(27));
session = sessionFactory.openSession();    
tx= session.beginTransaction(); 
session.update(user);
tx.commit();
session.close();

 

Session提供了一个saveOrUpdate()方法,为资料的储存或更新提供了一个统一的操作介面,藉由定义映射文件时,设定< id>标签的unsaved-value来决定什么是新的值必需,什么是已有的值必须更新: 
<id name="id" column="id" type="java.lang.Integer" unsaved-value="null">
    <generator class="native"/> 
</id> 

unsaved-value可以设定的值包括: 
  • any:总是储存
  • none:总是更新
  • null:id为null时储存(预设)
  • valid:id为null或是指定值时储存

这样设定之后,您可以使用Session的saveOrUpdate()方法来取代update()方法。

 

  • 合并状态
以这边的例子来说:
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
User user1 = (User) session.get(User.class, new Integer(2));
tx.commit();
session.close();
....
user1.setAge(new Integer(27));

session = sessionFactory.openSession();    
tx= session.beginTransaction(); 
User user2 = (User) session.get(User.class, new Integer(2)); // 同一个id
// user1 == user2 为 false
session.update(user1); // 丢出NonUniqueObjectException
tx.commit();
session.close();

 

在 进行update()之前,您就先从资料库中取得另一笔资料,之后再尝试更新user1,由于目前的Persistence context已载入一笔资料,并有同一个id的User 实例了,同一个Persistence context不会有两个相同id的物件实例,因此丢出NonUniqueObjectException。

就这边的例子来说,您应该使用merge()而不是update():
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
User user1 = (User) session.get(User.class, new Integer(2));
tx.commit();
session.close();
....
user1.setAge(new Integer(27));

session = sessionFactory.openSession();    
tx= session.beginTransaction(); 
User user2 = (User) session.get(User.class, new Integer(2)); // 同一个id
User user3 = (User) session.merge(user1);
// user1 == user2 为 false
// user2 == user3 为 true
tx.commit();
session.close();


merge()会将user1与user2的状态合并,传回的物件实例就是user2原先所参考的实例。

分享到:
评论

相关推荐

    Hibernate-nosession

    然而,在某些特定场景下,我们可能并不需要频繁地打开和关闭Session,这时“Hibernate-nosession”就显得尤为重要。本文将深入探讨Hibernate-nosession的概念、应用场景以及如何在实际代码中实现。 首先,理解什么...

    hibernate中session的管理

    在Hibernate框架中,Session是与数据库交互的主要接口,它负责对象的持久化操作。然而,由于Session不是线程安全的,所以在多线程环境中管理Session就需要特别注意。本篇文章将详细探讨Hibernate中Session的管理,...

    重写hibernate的session简单增删改查

    "重写hibernate的session简单增删改查"是一个针对初学者的实践教程,旨在帮助理解如何在Hibernate中自定义Session的操作,以便更好地控制数据库交互。 一、Hibernate Session Hibernate的Session是与数据库交互的...

    hibernate中session对象的状态详解

    hibernate中session对象的状态详解

    hibernate和session学习

    在Hibernate中,`SessionFactory`是核心组件之一,它是线程安全的,用于创建`Session`对象。`SessionFactory`通常在应用启动时创建一次,然后在整个应用生命周期中复用。创建`SessionFactory`需要通过读取Hibernate...

    Hibernate_Session_Transaction

    在Java的持久化框架Hibernate中,`Session`和`Transaction`是两个至关重要的概念,它们在数据管理和事务处理中起到核心作用。这篇文章将深入解析这两个概念及其相关知识点。 `Session`是Hibernate提供的一种与...

    Hibernate(session管理)

    本文将深入探讨Hibernate中的核心概念——Session管理。 首先,理解Session在Hibernate中的角色至关重要。Session是Hibernate的主要工作单元,它是应用程序与数据库之间的桥梁。它负责保存、检索和更新Java对象,...

    Hibernate的Session的javadoc

    Hibernate的Session接口是Java应用程序与Hibernate之间主要的运行时交互接口,它提供了对持久化对象的创建、读取和删除操作。Session的概念是基于对象的状态管理和数据库事务的,它的生命周期通常与一个物理事务绑定...

    org.hibernate.HibernateException: No Hibernate Session bound to thread

    Hibernate Session 绑定线程解决方案 在 Java web 开发中, Hibernate 是一个非常流行的 ORM(Object-Relational Mapping)框架,用于将 Java 对象映射到关系数据库中。然而,在使用 Hibernate 进行数据库操作时,...

    实现自己的Hibernate框架之Session 方法实现

    总之,实现自己的Hibernate框架之Session方法,不仅需要熟悉数据库操作,还需要掌握面向对象编程、设计模式、数据缓存等多方面技能。这个过程有助于提升我们的编程能力,更好地理解和运用ORM技术。

    hibernate session生命周期示例

    本示例将深入探讨Hibernate Session的生命周期及其使用,帮助你更好地理解和运用这个强大的工具。 Hibernate Session是Hibernate的核心接口,它是与数据库交互的主要接口。Session对象负责管理实体对象的状态,包括...

    Hibernate_session_factory_配置.docx

    在Java的持久层框架Hibernate中,SessionFactory是核心组件之一,它是线程安全的,负责创建Session对象,每个Session对应于数据库的一次会话。配置SessionFactory主要是通过Hibernate的配置文件(通常为hibernate....

    Hibernate Session释放模式

    在Java的持久化框架Hibernate中,Session对象是与数据库交互的核心组件,它负责管理对象的持久状态。在处理大量数据或者长时间运行的事务时,合理地管理Session的生命周期至关重要,这就涉及到了Hibernate的Session...

    hibernate的session.flush

    在Java的持久化框架Hibernate中,`Session`是与数据库交互的核心接口,它扮演着连接应用程序和数据库的角色。`Session.flush()`方法是一个关键的操作,它强制Hibernate将内存中的对象状态同步到数据库,确保数据的...

    hibernate--3.Hibernate数据持久化(通过 Session 操纵对象)

    Session是Hibernate的核心接口之一,它负责对象的持久化操作,比如保存、更新、删除和检索对象。Session对象就像一个临时的工作区域,用于在应用程序和数据库之间传递信息。当我们在Session上进行操作时,这些操作...

    hibernate的核心接口--Session

    - **定义**: Session 是 Hibernate 框架中最常用的接口之一,它又被称为持久化管理器。Session 负责所有与数据库交互的工作,包括管理持久化对象的生命周期,并通过提供第一级别的高级缓存来确保持久化对象的数据与...

    模拟hibernate的session.save()功能

    在这个"模拟hibernate的session.save()功能"的资源中,我们将深入理解Hibernate的核心操作之一:持久化对象。此程序源码的目的是帮助我们理解如何在没有Hibernate库的情况下实现类似的功能,这有助于我们更好地掌握...

    对Hibernate Session做一个简单的包装

    本篇文章将探讨如何对Hibernate的`Session`进行简单的包装,以提升代码的可维护性和灵活性。`Session`是Hibernate的核心组件,它负责对象的持久化操作,如保存、更新、查询等。 `Session`接口提供了多种方法来与...

    hibernate关于session的关闭实例解析

    关于 Hibernate 中 Session 的关闭实例解析 Hibernate 是一个流行的 Java 持久层框架,它提供了许多强大功能来管理数据库交互。Session 是 Hibernate 中的一种基本概念,它扮演着关键角色来管理数据库交互。本文将...

    Hibernate_11session

    《深入理解Hibernate Session:从配置到实践》 Hibernate,作为Java领域中一款广泛使用的对象关系映射(ORM)框架,极大地简化了数据库操作。在Hibernate中,Session是连接应用程序和数据库的重要桥梁,它负责对象...

Global site tag (gtag.js) - Google Analytics