hibernate持久化对象的三个状态

简介:

              Hibernate中的对象有3种状态,瞬时对象(TransientObjects)、持久化对象(PersistentObjects)和离线对象(DetachedObjects也叫做脱管对象)。这三个状态的主要区别在两方面:1、session;2、数据库

             

           下面说一下不同状态的特征:

           1、Transient (瞬态)       

      a) 不在Session的缓存中,不与任何的Session实例相关联。


        b) 在数据库中没有与之相对应的记录
<span style="font-size:14px;">User user = new User();
    user.setName("姓名");
    user.setAge("年龄");</span>
            通过Sessionsave()方法和saveOrUpdate()方法可以把一个临时对象和数据库相关联,并把临时对象携带的信息通过配置文件所做的映射插入数据库中,这个临时对象就成为持久化对象。

2、Persistent(持久态)

     a) 在Session的缓存中,与Session实例相关联。


            b) 在数据库中存在与之相对应的记录。

           通过Session对象的save()方法进行保存处于瞬时态的对象后,该对象就变为持久态。此时Session中已经存在该对象,并且对应数据库中的一条记录。
<span style="font-size:14px;">    </span><span style="font-size:18px;">SessionFactory sessionFactory = config.buildSessionFactory();  
	Session session = sessionFactory.getCurrentSession();  
	Transaction tx = session.beginTransaction();  
	User user = new User();  
	user.setName("姓名");
	user.setAge("年龄"); 
	session.save(user);  
	tx.commit(); </span>
          在调用save()方法后,持久化对象user就变为持久态,但是执行了commit()方法之后,数据库操作才会进行。
          3、Detached(游离态或脱管态)

     a) 不在Session的缓存中,不与任何的Session实例相关联


       b) 在数据库中存在与之相对应的记录。(前提条件是没有其他Session实例删除该条记录)。

   脱管对象虽然拥有用户的标识id,所以通过update()、saveOrUpdate()等方法,再次与持久层关联。
        二、session的get和load的区别
   我们在说这三态是引入了session,那为什么要用它呢?    

      1、减少访问数据库的频率,可以提高数据库访问的性能。

      2、保证缓存中的对象与数据库中的相关记录保持同步。

      3、当缓存中的持久化对象(位于缓存中的对象)之间存在循环关联关系时,Sessioin会保证不出现访问对象的死循环。

   get和load最大的区别,就是用get方法执行查询,会在执行get时马上查出,而load呢则是什么时候需要这些数据才会进行查询,也就是说load的特点是延迟加载lazy是通过实现代理对象实现,代理对象主要采用的是CGLIB库生成的,采用的是继承方式。不同于JDK中的代理。
 另外,这两个方法的区别就是:如果查询的数据为空,那么get方式返回null,而load方式会抛出ObjectNotFoundException异常

相关文章
|
SQL 缓存 Java
Hibernate对象状态之间的神奇转换
Hibernate对象状态之间的神奇转换
|
4月前
|
SQL Java 数据库连接
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。通过映射机制,它可以自动处理对象与数据库表之间的转换,支持主流数据库,提高了代码的可移植性和可维护性。其核心接口包括 SessionFactory、Session 和 Transaction 等,通过它们可以执行数据库的 CRUD 操作。配置方面,需在项目中引入 Hibernate 及数据库驱动依赖,并创建 `hibernate.cfg.xml` 配置文件来设置数据库连接和 Hibernate 行为参数。
58 1
|
4月前
|
Java 数据库连接 数据库
从零到精通:揭秘 Hibernate 构建持久层服务的全过程,你离数据持久化大师还有多远?
【8月更文挑战第31天】本文详细介绍了如何从零开始使用 Hibernate 构建一个持久层服务。首先,通过在 Maven 项目中添加必要的依赖,确保项目具备使用 Hibernate 的条件。接着,配置 `hibernate.cfg.xml` 文件以连接 MySQL 数据库,并设置了基本属性。然后定义了一个简单的 `User` 实体类及其映射关系。此外,还创建了一个 `HibernateUtil` 工具类来管理 `SessionFactory`。
42 0
|
4月前
|
Java 数据库连接 微服务
揭秘微服务架构下的数据魔方:Hibernate如何玩转分布式持久化,实现秒级响应的秘密武器?
【8月更文挑战第31天】微服务架构通过将系统拆分成独立服务,提升了可维护性和扩展性,但也带来了数据一致性和事务管理等挑战。Hibernate 作为强大的 ORM 工具,在微服务中发挥关键作用,通过二级缓存和分布式事务支持,简化了对象关系映射,并提供了有效的持久化策略。其二级缓存机制减少数据库访问,提升性能;支持 JTA 保证跨服务事务一致性;乐观锁机制解决并发数据冲突。合理配置 Hibernate 可助力构建高效稳定的分布式系统。
75 0
|
4月前
|
Java 数据库连接 数据库
|
4月前
|
Java 数据库连接 数据库
|
6月前
|
缓存 Java 数据库连接
解析Hibernate与JPA:Java对象的数据库化之旅
【6月更文挑战第25天】在Java企业开发中,Hibernate和JPA提供优雅的数据持久化方案。Hibernate是JPA规范的强大ORM实现,简化对象与数据库映射。配置环境后,通过@Entity注解定义实体类映射表,如`User`类映射&quot;users&quot;表。利用JPA的EntityManager执行查询和更新,如JPQL查询及对象更新。事务管理和性能优化是关键,确保数据完整性和应用性能。本文揭示了Hibernate与JPA的最佳实践,助开发者从容应对数据持久化。
52 0
|
6月前
|
存储 Java 数据库连接
深入探索Hibernate与JPA:Java对象与数据库表的桥梁
【6月更文挑战第25天】Java ORM如Hibernate和JPA简化了数据库交互。在电商系统案例中,JPA注解如`@Entity`、`@Table`、`@Id`定义了对象-表映射。Hibernate利用这些定义实现持久化,如`Session.save()`保存用户对象至数据库,降低了复杂性并提升了开发效率。
59 0
|
7月前
|
SQL Java 数据库连接
使用Hibernate进行数据库持久化操作
【4月更文挑战第15天】Hibernate 是一款开源 ORM 框架,简化数据库操作,通过映射将 Java 对象与表交互。核心接口包括 SessionFactory、Session、Transaction、Query 和 Criteria。使用 Hibernate 需添加依赖,配置 hibernate.cfg.xml 文件,设置数据库信息,并创建实体类及映射文件。
88 0