今天同事发现个问题,从使用get(id)的形式从数据库中获得对象,改变对象的ID,在没有使用update和merge方法的情况下竟然保存到数据库中了。当时很不解,后来就在网上搜,才知道是hibernate把get(id)获得的对象称为持久化对象,对其做的更改会在事务提交后保存到数据库中。也知道需要了解hibernate对象的三种状态了,临时状态,持久化状态和游离态。下面是在百度知道上搜到的答案,整理其中两条(其实这种框架了解的并不深啊,只是会用而已):
你通过get(id)拿到的对象,就是持久化对象。
你对持久化对象的任何更改,会在session.flush或者提交事务的时候更新到数据库。
不过也要结合事务。
如:
开启事务。
查询对象。
改变对象。//不需要显示的update。
提交事务。
就可以更新数据库。
建议学习一下hibernate的瞬态,持久态,托管态。
首先你要知道,hibernate的update操作的运行机理:
hibernate的update是怎么样自动的进行update操作的呢?
首先hibernate先会执行一个select操作,到数据库中查找当前要update操作的对象的主键是否存在,类似于:select id from table where id=XXX
如果查找到了改id,就说明该对象是一个持久化对象,如果该对像的某些属性变化了,hibernate就会自动的执行update操作,同步数据库中的该对象。
如果hibernate没有查找到该id,就说明该对象是一个游离的对象,hibernate就会执行insert操作。
根据这些,就可以找找是不是要update的对象的id在数据库中不存在,或是更改的该对象的id。这些都是执行insert而不是update。
相关推荐
当事务提交时,Hibernate会通过SQL的INSERT、UPDATE和DELETE语句将内存中的状态同步到数据库。持久化对象始终与一个Session实例关联,并且与数据库中的记录相对应。Session的多种方法如`save()`, `load()`, `get()`,...
在Java的ORM框架Hibernate中,`merge()`是一个非常重要的操作,它主要用于将游离态或瞬态的对象合并到持久化状态。理解`merge()`的工作原理对于优化数据操作和避免潜在的冲突至关重要。以下是对`merge()`函数的详细...
在北大青鸟的教材中,会详细讲解如何在实际项目中应用Hibernate进行对象持久化。这包括数据库设计、实体类创建、配置文件编写、DAO层设计以及事务管理等步骤。通过学习,开发者可以更好地理解和掌握Hibernate在实际...
例如,使用`save()`或`saveOrUpdate()`方法可以将对象持久化到数据库,`get()`和`load()`用于根据ID获取对象,`update()`和`merge()`用于更新对象,`delete()`则用于删除对象。 事务管理是数据库操作中的关键部分。...
`update()`方法适用于对象已经存在于持久化上下文的情况,而`merge()`则会复制当前对象的状态到持久化的副本,即使原对象未被持久化。 删除对象时,使用`delete()`方法。例如: ```java session.delete(entity); `...
5.1.3 在持久化类的访问方法中加入程序逻辑 5.1.4 设置派生属性 5.1.5 控制insert和update语句 5.2 处理SQL引用标识符 5.3 创建命名策略 5.4 设置数据库Schema 5.5 设置类的包名 5.6 运行本章的范例...
- **修改托管状态的持久化对象**:对于已经脱离Session管理的托管对象,可以使用`update()`、`merge()`或`updateOrSave()`等方法来更新数据库。例如: ```java News n = firstSess.load(News.class, new Integer...
对这些对象的修改会在事务提交时自动更新到数据库。 - **detached(游离)**:对象曾经是持久化的,但已从Session中移除,比如在调用`detach`或`clear`后。游离状态的对象可以通过`merge`或`update`方法重新与...
此时,对象的实例与数据库中的记录对应,任何对持久对象属性的修改,只要在事务范围内,都会在事务提交时由Session自动更新到数据库中。如果需要从数据库加载特定对象,Hibernate会首先检查Session缓存,若未找到再...
4. **持久化类(Persistent Class)**: 实体类必须是可序列化的,即实现`Serializable`接口,这样才能确保对象能够在内存中持久化。 5. **会话(Session)**: Hibernate的会话接口是操作数据库的主要入口点,它负责...
这意味着对象与一个特定的Session绑定,并且任何对持久化对象属性的更改都会在Session提交时同步到数据库。通过Session的save()、get()或load()方法可以将对象设置为持久化状态。 - Detached(游离):持久化对象...
本章主要介绍单个持久化类与单个数据库表之间进行映射的方法,尤其是当持久化类的属性不和数据库表的字段一一对应时的映射技巧。 5.1 持久化类的属性及访问方法 101 5.1.1 基本类型属性和包装类型属性 102 5.1.2 ...
例如,创建一个Customer对象,将其保存,然后通过load()方法再次获取该对象,即使没有显式调用update(),对象的更改也会在事务提交时更新到数据库。持久对象始终与Session和Transaction相关联,其状态在Transaction...
本章主要介绍单个持久化类与单个数据库表之间进行映射的方法,尤其是当持久化类的属性不和数据库表的字段一一对应时的映射技巧。 5.1 持久化类的属性及访问方法 101 5.1.1 基本类型属性和包装类型属性 102 5.1.2 ...
5.1.3 在持久化类的访问方法中加入程序逻辑 5.1.4 设置派生属性 5.1.5 控制insert和update语句 5.2 处理SQL引用标识符 5.3 创建命名策略 5.4 设置数据库Schema 5.5 设置类的包名 5.6 运行本章的范例...
在`testUpdate1()`示例中,创建了一个用户对象并设置了已存在的ID,然后调用`update()`方法,Hibernate会尝试将这个对象的属性更新到数据库对应的记录上。 3. **查询操作:Get与Load**: - `get()`方法直接查询...
5.1.3 在持久化类的访问方法中加入程序逻辑 5.1.4 设置派生属性 5.1.5 控制insert和update语句 5.2 处理SQL引用标识符 5.3 创建命名策略 5.4 设置数据库Schema 5.5 设置类的包名 5.6 运行本章的范例...
5.1.3 在持久化类的访问方法中加入程序逻辑 5.1.4 设置派生属性 5.1.5 控制insert和update语句 5.2 处理SQL引用标识符 5.3 创建命名策略 5.4 设置数据库Schema 5.5 设置类的包名 5.6 运行本章的范例...
- 如果需要再次操作这个对象,可以使用Session的get()或load()方法获取已持久化的对象,或者通过merge()或update()方法将脱管态对象变为持久态。 4. Session的作用: Session是Hibernate的核心接口,它是数据库...
**临时状态(Transient) -> 持久化状态(Persistent)**:通过调用Session的`get()`, `load()`, `find()`, `iterate()`等方法,可以直接将新创建的对象绑定到数据库中的记录,从而使其进入持久化状态。 **游离状态...