有时在更改实体的属性时,与数据库中对应的列值也会被更改了; 而有时候又无法对应更新起来, 我的痛苦在于想更新的时候无法更新, 不想更新的时候却更新了........
解决之道: 还是得从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()方法