`

Hibernate实体状态

阅读更多

一.Hibernate实体状态的定义
1.瞬态:
 一个实体通过new操作符创建后,没有和Hibernate的Session建立关系,也没有手动赋值过该实体的持久化
标识(持久化标识可以认为是映射表的主键)。
 此时该实体中任何属性的更新都不会反映到数据库表中。

2.持久化:
 当一个实体和Hibernate的Session创建了关系,并获取了持久化标识,而且在Hibernate的Session生命周期内
存在。
 此时针对该实体任何属性的更改都会直接影响到数据库表中一条记录对应字段的更新,即与数据库表同步。

3.脱管:
 当一个实体和Hibernate的Session创建了关系,并获取了持久化标识,而此时Hibernate的Session生命周期结
束,实体的持久化标识没有被改动过。
 针对该实体任何属性的修改都不会及时反映到数据库表中。

二.实体状态的代码实现
1.瞬态-->持久化的实现

public void test1() {
        Catalogs catalog 
= new Catalogs();
        
// 设置Catalogs属性,持久化标识id属性在映射表中为自增长,不用设置
        catalog.setName("Cosmo's Catalog");
        catalog.setStatus(
1L);
        catalog.setType(
1L);
        
// 启动Session
        Session session = HibernateSessionFactory.getSession();
        
// 启动事务
        Transaction tx = session.beginTransaction();
        
// 瞬时-->持久化的实现,保存Catalogs代表的一条记录到数据库
        session.save(catalog);
        
// 打印结果
        System.out.println("----Id:" + catalog.getId());
        System.out.println(
"----Name:" + catalog.getName());
        System.out.println(
"----Status:" + catalog.getStatus());
        System.out.println(
"----Type:" + catalog.getType());
        
// 对持久化的Catalogs进行属性的更新,此时将同步数据库
        catalog.setName("方寸心间的目录");
        catalog.setType(
0L);
        catalog.setStatus(
0L);
        
// 不调用update方法,持久化状态的Catalogs会自动同步数据库
        
// 打印结果
        System.out.println("----Id:" + catalog.getId());
        System.out.println(
"----Name:" + catalog.getName());
        System.out.println(
"----Status:" + catalog.getStatus());
        System.out.println(
"----Type:" + catalog.getType());
        
// 提交事务
        tx.commit();
        
// 关闭Hibernate Session
        HibernateSessionFactory.closeSession();
    }


2.脱管-->持久化、持久化-->脱管

public void test2() {
        
// 创建Catalogs实例
        Catalogs catalog = new Catalogs();
        
// 启动Session
        Session session = HibernateSessionFactory.getSession();
        
// 启动事务
        Transaction tx = session.beginTransaction();
        
// 得到持久化Catalogs,此时Catalogs为持久化状态
        session.load(catalog, new Long(101));
        
// 提交事务
        tx.commit();
        
// 关闭Hibernate Session
        HibernateSessionFactory.closeSession();
        
// 关闭Hibernate Session后Catalogs的状态为脱管状态
        
// 此时依然能够得到数据库在持久化状态时的数据
        System.out.println("----Id:" + catalog.getId());
        System.out.println(
"----Name:" + catalog.getName());
        System.out.println(
"----Status:" + catalog.getStatus());
        System.out.println(
"----Type:" + catalog.getType());
        
// 对Catalogs实体的属性的操作将不影响数据库中主键为101的记录
        catalog.setName("我的目录");
        catalog.setStatus(
1L);
        catalog.setType(
1L);
        
// 启动Session
        session = HibernateSessionFactory.getSession();
        
// 启动事务
        tx = session.beginTransaction();
        
// 从脱管状态到持久化状态的转变,此时将更新数据库中对应主键为101的记录
        session.update(catalog);
        
// 打印结果
        System.out.println("----Id:" + catalog.getId());
        System.out.println(
"----Name:" + catalog.getName());
        System.out.println(
"----Status:" + catalog.getStatus());
        System.out.println(
"----Type:" + catalog.getType());
        
// 提交事务
        tx.commit();
        
// 关闭Hibernate Session
        HibernateSessionFactory.closeSession();
    }


三.持久化方法对状态的影响
1.session.delete()方法
 该方法将已经存在的表记录删除,其所影响的状态是从持久化、脱管状态变为瞬时状态。

public void testDelete() {
        
// 创建Catalogs实例
        Catalogs catalog = new Catalogs();
        
// 启动Session
        Session session = HibernateSessionFactory.getSession();
        
// 启动事务
        Transaction tx = session.beginTransaction();
        
// 得到持久化Catalogs,此时Catalogs为持久化状态
        session.load(catalog, new Long(101));
        
// 删除持久化状态的Catalogs实体,此时Catalogs实体为瞬时状态。
        session.delete(catalog);
        
// 提交事务
        tx.commit();
        
// 关闭Hibernate Session
        HibernateSessionFactory.closeSession();
        
// 由于执行了session.delete()因此Catalogs实体为瞬时状态,在数据库中找不到主键为101的数据
        
// 此时依然能够显示该实体的属性
        System.out.println("----Id:" + catalog.getId());
        System.out.println(
"----Name:" + catalog.getName());
        System.out.println(
"----Status:" + catalog.getStatus());
        System.out.println(
"----Type:" + catalog.getType());
        
// 更新Catalogs实体的持久化标志,使其成为脱管状态
        catalog.setId(new Long(1));
        System.out.println(
"----Id:" + catalog.getId());
        System.out.println(
"----Name:" + catalog.getName());
        System.out.println(
"----Status:" + catalog.getStatus());
        System.out.println(
"----Type:" + catalog.getType());
        
// 启动Session
        session = HibernateSessionFactory.getSession();
        
// 启动事务
        tx = session.beginTransaction();
        
// 调用delete方法将脱管状态的Catalogs实体转变为瞬时状态。
        session.delete(catalog);
        
// 提交事务
        tx.commit();
        
// 关闭Hibernate Session
        HibernateSessionFactory.closeSession();
    }

 

2.session.merge()方法
 该方法将修改表中记录,其所需要的实体状态为脱管状态,但是注意,它并不影响调用方法前后的状态,即
该实体依然是脱管状态。
代码省略。

3.session.lock()方法
 它为解决事务处理而使用,它会将实体从脱管状态转变为持久化状态。但是值得注意的是,调用session.lock()
方法后,脱管状态的实体信息不会同步到数据库,而是会从数据库中返回该持久化状态。即使在脱管状态对实体属
性进行了修改,一旦调用了session.lock()方法,这种修改该就成了无效。
代码省略。

4.session.saveOrUpdate()方法
 它是Hibernate提供的既可以新增也可以更新的方法,改方法使实体状态从脱管或瞬时直接变成持久化。
 session.saveOrUpdate()方法对实体的持久化标识非常敏感。当实体持久化标识存在,就回发送update SQL,当持
久化标识不存在,就会发送insert SQL。
代码省略。

总结:
1.瞬时-->脱管状态的方法有以下几种。
a.直接将实体的持久化标识进行改变。
b.调用session.createQuery()方法。
c.调用session.getNameQuery()方法。
d.调用session.createFilter()方法。
e.调用session.createCriteria()方法。
f.调用session.createSQLQuery()方法。

2.瞬时-->持久化状态的方法有以下几种。
a.调用session.save()方法。
b.调用session.saveOrUpdate()方法。

3.脱管-->持久化状态的方法有以下几种。
a.调用session.load()方法。
b.调用session.lock()方法。
c.调用session.update()方法。
d.调用session.saveOrUpdate()方法。

4.脱管-->瞬时状态的方法有以下几种。
a.直接将实体的持久化标识清除。
b.调用session.delete()方法。

5.持久化-->脱管状态的方法:关闭Hibernate Session。

6.持久化-->瞬时状态的方法:调用session.delete()方法。

7.脱管状态-->脱管状态但影响数据库记录的方法:调用session.merge()方法。

分享到:
评论

相关推荐

    Hibernate中的实体状态及转换

    Hibernate 实体状态 瞬态(transient) 持久化(persistent) 脱管(detached) 转换

    hibernated的线程同步问题

    hibernate数据的并发控制,及hibernate中的session.get()与session.load()方法异同

    HiberNate实体

    hibernate实体有三个状态 1、瞬时状态 对象由new操作符创建,尚未与Session关联的对象被认为处于瞬态.瞬态对象不会持久化到数据库中,也不会被赋予持久化标识.而这个时候只在内存中存在,与数据库无关 2、持久状态 ...

    Hibernate学习笔记和资料

    hibernate概述,hibernate入门Demo,hibernate配置文件详解(全局配置,实体类映射配置),配置实体规则,核心API详解(Configuration,sessionFactory,session,Transaction),hibernate中的对象状态以及刷新能缓存机制 ...

    05_传智播客hibernate教程_实体对象的三种状态与saveOrUpdate方法

    05_传智播客hibernate教程_实体对象的三种状态与saveOrUpdate方法

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

     8.3 Java对象在Hibernate持久化层的状态  8.3.1 临时对象的特征  8.3.2 持久化对象的特征  8.3.3 被删除对象的特征  8.3.4 游离对象的特征  8.4 Session接口的详细用法  8.4.1 Session的save()和persist()...

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

    第一部分 从Hibernate和EJB 3.0开始  第1章 理解对象/关系持久化   1.1 什么是持久化   1.1.1 关系数据库   1.1.2 理解SQL   1.1.3 在Java中使用SQL   1.1.4 面向对象应用程序中的持久化   1.2 范式不...

    Hibernate+中文文档

    10.1. Hibernate对象状态(object states) 10.2. 使对象持久化 10.3. 装载对象 10.4. 查询 10.4.1. 执行查询 10.4.2. 过滤集合 10.4.3. 条件查询(Criteria queries) 10.4.4. 使用原生SQL的查询 10.5. 修改...

    hibernate3.2中文文档(chm格式)

    10.1. Hibernate对象状态(object states) 10.2. 使对象持久化 10.3. 装载对象 10.4. 查询 10.4.1. 执行查询 10.4.2. 过滤集合 10.4.3. 条件查询(Criteria queries) 10.4.4. 使用原生SQL的查询 10.5. 修改...

    HibernateAPI中文版.chm

    10.1. Hibernate对象状态(object states) 10.2. 使对象持久化 10.3. 装载对象 10.4. 查询 10.4.1. 执行查询 10.4.2. 过滤集合 10.4.3. 条件查询(Criteria queries) 10.4.4. 使用原生SQL的查询 10.5. 修改...

    传智播客李勇hibernate源码1-20课

    05_实体对象的三种状态与saveOrUpdate方法 06_完善HibernateUtil类及hql查询入门 07_实体类或属性名与数据库关键字冲突问题 10_使用Hibernate完成CRUD实验的步骤说明 11_完成CRUD实验并回顾和补充细节知识(上)...

    Hibernate注释大全收藏

    Hibernate注释大全收藏 声明实体Bean @Entity public class Flight implements Serializable { Long id; @Id public Long getId() { return id; } public void setId(Long id) { this.id = id; } } @Entity ...

    Hibernate中文详细学习文档

    10.1. Hibernate对象状态(object states) 10.2. 使对象持久化 10.3. 装载对象 10.4. 查询 10.4.1. 执行查询 10.4.2. 过滤集合 10.4.3. 条件查询(Criteria queries) 10.4.4. 使用原生SQL的查询 10.5. 修改...

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

    本章站在持久化层的角度,Java对象在生命周期中可处于临时状态、持久化状态、删除状态和游离状态。处于持久化状态的Java对象位于一个Session实例的缓存中,Session能根据这个对象的属性变化来同步更新数据库。 8.1 ...

    Hibernate 中文 html 帮助文档

    10.1. Hibernate对象状态(object states) 10.2. 使对象持久化 10.3. 装载对象 10.4. 查询 10.4.1. 执行查询 10.4.1.1. 迭代式获取结果(Iterating results) 10.4.1.2. 返回元组(tuples)的查询 10.4.1.3. 标量(Scalar)...

    最全Hibernate 参考文档

    10.1. Hibernate对象状态(object states) 10.2. 使对象持久化 10.3. 装载对象 10.4. 查询 10.4.1. 执行查询 10.4.1.1. 迭代式获取结果(Iterating results) 10.4.1.2. 返回元组(tuples)的查询 10.4.1.3. 标量(Scalar)...

    JPA学习笔记-EJB-05JPA实体对象状态和实体对象的高级操作

    虽然持久化实体的状态在ORM中是一个老生常谈的问题,但是说实在的,我们在开发过程中真的不太在意实体的状态。在Web一般情况下也都是交给Spring去管理实体管理器(EntityManager),所以我们还是有必要啰嗦一下,...

    hibernate 体系结构与配置 参考文档(html)

    Hibernate对象状态(object states) 10.2. 使对象持久化 10.3. 装载对象 10.4. 查询 10.4.1. 执行查询 10.4.1.1. 迭代式获取结果(Iterating results) 10.4.1.2. 返回元组(tuples)的查询 10.4.1.3. 标量...

    Hibernate教程

    11.1. Hibernate对象状态(object states) 11.2. 使对象持久化 11.3. 装载对象 11.4. 查询 11.4.1. 执行查询 11.4.1.1. 迭代式获取结果(Iterating results) 11.4.1.2. 返回元组(tuples)的查询 11.4.1.3. 标量...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    10.1. Hibernate对象状态(object states) 10.2. 使对象持久化 10.3. 装载对象 10.4. 查询 10.4.1. 执行查询 10.4.2. 过滤集合 10.4.3. 条件查询(Criteria queries) 10.4.4. 使用原生SQL的查询 10.5. 修改...

Global site tag (gtag.js) - Google Analytics