public void deleteUserById(Integer id){
TypedQuery<User> query = em.createQuery("from " + User.class.getName() + " user where user.id = :userid ", User.class);
query.setParameter("userid", id);
User user = query.getSingleResult();
em.remove(user);
}
@Transactional
public void deleteUserById(Integer id){
userDao.deleteUserById(id);
}
如dao里上段代码,如果service调用方法没有申明事务,user对象会被entity manager(jpa实现是hibernate)认为是detached的,抛异常。想问下不申明事务,代理对象(如果被代理了)是怎么处理的呢?
按我的理解,查询没有事务也是可以的,如果开启了默认事务,query和remove共用一个entity manager,既然查出来了应是托管状态吧。如果没有任何事务,remove不会去commit,就算是做状态检查,但是查询成功了,共用em,不至于是游离态呀,如果用aop了,不至于智能到去拆分deleteUserById方法,执行查询后,entitymanager执行clear操作。
问题补充:AngelAndAngel 写道
事务范围不代表session内缓存的entity生命周期。
恩,我要问的是把那个事务声明去掉后的行为是怎样的,也就是你说的entity在查询出来后为什么变成的detached了,如果加上事务声明就不是的了。
相关推荐
如果对象在临时状态下被垃圾收集器清理,那么这个对象在数据库中的记录并不会受到影响,因为它们之间没有绑定关系。如果想要使对象进入持久状态,需要通过Session的`save()`、`saveOrUpdate()`或`persist()`方法。 ...
- 可以通过调用 `Session` 的 `save()` 或 `saveOrUpdate()` 方法将瞬时对象转换为持久对象,此时对象的状态会与数据库同步。 2. **持久对象(Persistent Objects)** - 持久对象拥有唯一的数据库标识(ID),...
本篇文章将深入探讨Hibernate中的方法和对象查询,以及相关的源码分析。 首先,让我们理解Hibernate的核心概念:Session。在Hibernate中,Session是与数据库交互的主要接口,它负责管理对象的状态。例如,通过`...
一旦瞬时状态的对象通过`persist()`方法被实体管理器管理后,该对象转变为托管状态。在此状态下,实体管理器会跟踪实体对象的所有更改,并在适当的时候将这些更改同步到数据库中。 3. **持久化状态(Persistent ...
这个状态下,对象没有被保存到数据库,任何对对象属性的修改不会自动同步到数据库。如果对象被删除,那么这些更改将永久丢失。 2. **持久化状态(Persistent)**: 当对象通过Session的`save()`、`saveOrUpdate()`...
Repository接口下可以定义自定义查询方法,通过Spring Data JPA提供的命名规则,可直接实现对数据库的查询操作,无需编写实现类。 4. JPA核心概念与新特性 JPA的核心概念包括实体、实体管理器、持久化上下文等。在...
在Java的持久化框架Hibernate中,实体对象的状态管理和`saveOrUpdate`方法是核心概念,对于理解和有效使用Hibernate至关重要。在本教程中,我们将深入探讨实体对象的三种状态以及`saveOrUpdate`方法的工作原理。 ...
而Hibernate 则是一个对象关系映射(ORM)工具,它简化了Java应用与数据库之间的交互,通过将Java对象转化为SQL语句,实现了数据持久化。 Spring 2.5 版本引入了许多增强特性,包括: 1. **依赖注入(Dependency ...
例如,通过将事务传播属性设为`REQUIRED`,如果当前没有事务,Spring会在调用方法前开启一个新的事务;如果已有事务,则加入到当前事务中。`Session`的创建与关闭通常伴随着数据库连接的建立与断开,而`commit()`会...
- **load()**:尝试从缓存中加载对象,如果缓存中没有,则发起数据库查询,但该方法会抛出异常,如果找不到对象。 - **get()**:与load()类似,但不会抛出异常,而是返回null。 #### 6. Spring AOP(面向切面编程)...
Session的多种方法如`save()`, `load()`, `get()`, `find()`, `update()`, `saveOrUpdate()`, `lock()`等可以将对象转变为持久化状态。 3. **离线对象(Detached Objects)**: - 离线对象是曾经是持久化对象,但...
在Hibernate中,对象有三种状态:瞬时态(transient)、持久态(persistent)和脱管态(detached)。瞬时态是指new出来的对象,尚未与Hibernate Session关联。持久态是指已经被Hibernate Session管理的对象。脱管态...
【HibernateDaoSupport】是Spring框架中的一个抽象类,主要用于简化Hibernate的数据访问操作,它为DAO层提供了方便的事务管理和Session管理。这个类是Spring与Hibernate集成的重要组件,尤其对于初学者来说,理解其...
Session提供了事务管理和缓存功能,确保了对象状态的正确管理。例如,一级缓存(First Level Cache)自动管理持久态对象,而二级缓存(Second Level Cache)则可跨Session共享数据,提高性能。 6. HQL与 Criteria ...
在Java的持久化框架Hibernate中,对象存在三种不同的状态,分别是持久态(Persistent)、自由态(Transient)和游离态(Detached)。这三种状态分别对应了对象与数据库的关联程度,理解它们对于高效地使用Hibernate...
例如,创建一个Customer对象,将其保存,然后通过load()方法再次获取该对象,即使没有显式调用update(),对象的更改也会在事务提交时更新到数据库。持久对象始终与Session和Transaction相关联,其状态在Transaction...
`Session.save()`, `Session.load()`, `Session.get()`等方法会将对象置于持久化状态。 - **游离状态(Detached)**:对象不再在Session缓存中,但数据库可能仍有记录。关闭Session或调用`Session.evict()`会使得对象...
在实际开发中,通常在事务的边界进行对象状态的转换,如在事务提交时(`s.getTransaction().commit();`)或在需要强制同步时调用`flush()`。此外,一些查询操作也可能触发Session的自动刷新,以保证数据的准确。
通过Session的save()、get()或load()方法可以将对象设置为持久化状态。 - Detached(游离):持久化对象在Session关闭后,就会变为游离状态。这时,对象与Session断开,但其仍然包含数据库中的数据副本。更新游离...
Hibernate将对象的状态划分为四种:临时状态、持久化状态、游离状态和删除状态。这些状态反映了对象与数据库记录之间的关系,有助于理解Hibernate如何管理和操作数据。 1. **临时状态(Transient State)**: 当一...