evict()与merge()都用于解决:
内存中存在2个id相同的对象,session发现对象不唯一而抛出异常。
package org.leadfar.hibernate.model; import java.util.Date; import junit.framework.TestCase; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class UserTest03 extends TestCase { public void testUser_01() throws Exception { //默认读取类路径根目录下的hibernate.cfg.xml配置文件 Configuration cfg = new Configuration().configure(); //创建SessionFactory SessionFactory sfactory = cfg.buildSessionFactory(); //创建Hibernate Session Session session = sfactory.openSession(); //创建实体对象 User user = new User();//此时User对象处于Transient(瞬时)状态 user.setName("张三"); user.setAge(20); user.setSex(false); user.setBirthday(new Date()); user.setMoney(99999.99); user.setId(109); try { //开启事务 session.beginTransaction(); User dbUser = (User)session.get(User.class, 109); Date oldbirthday = dbUser.getBirthday(); //session.update(user):发生异常。 //具有相同标识符的不同对象与同一个session相关联,引发异常NonUniqueObjectException //org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [org.leadfar.hibernate.model.User#109] session.update(user);//update离线对象---当前session绑定的对象是dbUser,但是更新的是user对象(内存中存在两个对象与数据库中同一条记录(id=109)相关联) user.setName("手机"); user.setBirthday(oldbirthday); //提交事务 session.getTransaction().commit(); } catch(Exception e) { e.printStackTrace(); //出现异常,回滚事务 session.getTransaction().rollback(); } finally { //关闭session session.close();//session关闭之后,user对象处于离线Detached状态 } } public void testUser_02() throws Exception { //默认读取类路径根目录下的hibernate.cfg.xml配置文件 Configuration cfg = new Configuration().configure(); //创建SessionFactory SessionFactory sfactory = cfg.buildSessionFactory(); //创建Hibernate Session Session session = sfactory.openSession(); //创建实体对象 User user = new User();//此时User对象处于Transient(瞬时)状态 user.setName("张三"); user.setAge(20); user.setSex(false); user.setMoney(99999.99); user.setId(109); try { //开启事务 session.beginTransaction(); User dbUser = (User)session.get(User.class, 109); Date oldbirthday = dbUser.getBirthday();//获取以前对象的birthday //切断与session的连接,释放session session.evict(dbUser); //update离线对象,与session进行关联 session.update(user); user.setName("手机"); user.setBirthday(oldbirthday);//设置以前对象的birthday到新的对象中(保证birthday不变) //提交事务 session.getTransaction().commit(); } catch(Exception e) { e.printStackTrace(); //出现异常,回滚事务 session.getTransaction().rollback(); } finally { //关闭session session.close();//session关闭之后,user对象处于离线Detached状态 } } //merge解决了两个对象关联一个session的问题 public void testUser_merge() throws Exception { //默认读取类路径根目录下的hibernate.cfg.xml配置文件 Configuration cfg = new Configuration().configure(); //创建SessionFactory SessionFactory sfactory = cfg.buildSessionFactory(); //创建Hibernate Session Session session = sfactory.openSession(); //创建实体对象 User user = new User();//此时User对象处于Transient(瞬时)状态 user.setName("美女2号线"); user.setAge(20); user.setSex(false); user.setMoney(88.99); user.setId(109);//带更新的记录主键为109 try { //开启事务 session.beginTransaction(); //dbUser与session关联 User dbUser = (User)session.get(User.class, 109); user.setBirthday(dbUser.getBirthday());//设置以前对象的birthday到新的对象中(保证birthday不变) //merge--不用evict(驱逐)其它对象释放session //相当于把user对象的值拷贝到dbUser持久化对象中 //由于没有调用update方法,所以user对象是处于瞬时状态的! //session关联的对象是dbUser,而user对象只是一个瞬时状态的对象 session.merge(user); //提交事务 session.getTransaction().commit(); } catch(Exception e) { e.printStackTrace(); //出现异常,回滚事务 session.getTransaction().rollback(); } finally { //关闭session session.close();//session关闭之后,user对象处于离线Detached状态 } } }
相关推荐
2. **配置文件**:`hibernate.cfg.xml`是Hibernate的主配置文件,其中包含了数据库连接信息、事务管理策略、缓存配置等设置。在3.2版本中,开发者需要在这个文件中定义数据源、JDBC驱动等信息。 3. **实体类与映射...
在使用Hibernate3.1 API时,首先需要配置hibernate.cfg.xml文件,其中包含了数据库连接信息、缓存设置、方言选择等关键参数。完成配置后,通过SessionFactory的createSessionFactory()方法初始化会话工厂,为后续...
- Hibernate是一个对象关系映射(ORM)框架,通过提供API和XML配置文件,使得Java对象可以直接与数据库进行交互。 - Hibernate工作原理主要包括读取配置文件和映射信息,创建SessionFactory,然后通过...
Hibernate 是一个开源的对象关系映射(ORM)框架,它允许Java开发者将数据库操作与对象模型进行无缝集成。这个“Hibernate帮助手册API大集合”显然包含了关于Hibernate的各种API文档和参考资料,旨在提供全面的指南...
通过XML映射文件或注解,Hibernate可以自动将对象转换为数据库中的记录,反之亦然。 2. **Session工厂(SessionFactory)**:SessionFactory是Hibernate的主要入口点,它负责管理和配置数据库连接,以及生成Session...
- `Configuration`是配置Hibernate的核心类,负责读取Hibernate配置文件(hbm.xml或hibernate.cfg.xml),并建立Java类与数据库表之间的映射关系。 - `SessionFactory`是线程安全的,通常在应用启动时创建,然后在...
以下是对给定文件中提到的关键知识点的详细解读: ### 持久化对象的三种状态 1. **瞬时状态**:对象被new创建后,处于瞬时状态,此时它没有数据库ID,也不受Session管理。 2. **持久化状态**:当对象被Session加载...
另外,`Session`还有一系列方法用于处理对象的状态转换,如`lock()`、`merge()`、`refresh()`、`evict()`等,这些方法在处理对象生命周期的不同阶段时非常关键。 `Configuration`和`SessionFactory`也是Hibernate的...
- **Configuration**:在Hibernate中,`Configuration` 类是配置Hibernate的基础,它负责加载配置文件(如 `hibernate.cfg.xml` 和实体映射文件等),并且通过它来创建 `SessionFactory` 实例。`Configuration` 是一...
2. **配置文件**:包括hibernate.cfg.xml,用来配置数据库连接信息,以及实体类的映射文件(hbm.xml),定义对象与表的映射规则。 3. **Session和Transaction**: Hibernate的核心工作单元是Session,负责对象的持久...