Hibernate困惑之 状态变迁

本文详细解析了Hibernate中瞬时、持久化及脱管三种状态的概念,并总结了各种状态下实体对象如何转换状态的方法,帮助理解Hibernate如何同步实体属性变化到数据库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      有时在更改实体的属性时,与数据库中对应的列值也会被更改了; 而有时候又无法对应更新起来, 我的痛苦在于想更新的时候无法更新, 不想更新的时候却更新了........

      解决之道:  还是得从Hibernate的三个状态谈起。

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

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

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

  ———————————————————Hibernate持久化方法总结————————————————

  (1) 瞬时————脱管状态

     ——直接将实体的持久化标签进行改变

   ——调用session.createQuery()方法

  ——调用session.getNameQuery()方法

  ——调用session.createFilter()方法

  ——调用session.createCriteria()方法

  ——调用session.createSqlQuery()方法

  (2)瞬时——持久化状态方法

  ——调用session.save()方法

  ——调用session.saveOrUpdate()方法

  (3)脱管——持久化状态的方法

  ——调用session.load()方法

 ——调用session.lock()方法

 ——调用session.update()方法

 ——调用session.saveOrUpdate()方法

 

  (4)脱管——瞬时状态的方法有:

 ——直接将实体的持久化标识清除

 ——调用session.delete()方法

 (5)持久化——脱管状态的方法:

 ——关闭Hibernate

 (6)持久化——瞬时状态的方法

 ——调用session.delete()方法

 

 (7)脱管状态——脱管状态 影响到数据库记录的方法:

  ——调用session.merger()方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值