0 0

没有申明spring 事务,DAO方法里查询的对象为什么是detached状态。 3

	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了,如果加上事务声明就不是的了。
2012年2月20日 01:00

2个答案 按时间排序 按投票排序

0 0

都木有log

2012年3月05日 21:07
0 0

事务范围不代表session内缓存的entity生命周期。

2012年2月20日 10:01

相关推荐

    Hibernate 对象的三种状态和特点

    如果对象在临时状态下被垃圾收集器清理,那么这个对象在数据库中的记录并不会受到影响,因为它们之间没有绑定关系。如果想要使对象进入持久状态,需要通过Session的`save()`、`saveOrUpdate()`或`persist()`方法。 ...

    Hibernate对象状态以及各种保存方法的区别

    - 可以通过调用 `Session` 的 `save()` 或 `saveOrUpdate()` 方法将瞬时对象转换为持久对象,此时对象的状态会与数据库同步。 2. **持久对象(Persistent Objects)** - 持久对象拥有唯一的数据库标识(ID),...

    hibrenate方法和对象查询源码

    本篇文章将深入探讨Hibernate中的方法和对象查询,以及相关的源码分析。 首先,让我们理解Hibernate的核心概念:Session。在Hibernate中,Session是与数据库交互的主要接口,它负责管理对象的状态。例如,通过`...

    JPA学习笔记-EJB-05JPA实体对象状态和实体对象的高级操作

    一旦瞬时状态的对象通过`persist()`方法被实体管理器管理后,该对象转变为托管状态。在此状态下,实体管理器会跟踪实体对象的所有更改,并在适当的时候将这些更改同步到数据库中。 3. **持久化状态(Persistent ...

    SSHnote session函数的对象状态转换

    这个状态下,对象没有被保存到数据库,任何对对象属性的修改不会自动同步到数据库。如果对象被删除,那么这些更改将永久丢失。 2. **持久化状态(Persistent)**: 当对象通过Session的`save()`、`saveOrUpdate()`...

    spring boot 整合JPA及使用方法

    Repository接口下可以定义自定义查询方法,通过Spring Data JPA提供的命名规则,可直接实现对数据库的查询操作,无需编写实现类。 4. JPA核心概念与新特性 JPA的核心概念包括实体、实体管理器、持久化上下文等。在...

    05_传智播客hibernate教程_实体对象的三种状态与saveOrUpdate方法

    在Java的持久化框架Hibernate中,实体对象的状态管理和`saveOrUpdate`方法是核心概念,对于理解和有效使用Hibernate至关重要。在本教程中,我们将深入探讨实体对象的三种状态以及`saveOrUpdate`方法的工作原理。 ...

    Spring2.5+Hibernate3.2开发手册

    而Hibernate 则是一个对象关系映射(ORM)工具,它简化了Java应用与数据库之间的交互,通过将Java对象转化为SQL语句,实现了数据持久化。 Spring 2.5 版本引入了许多增强特性,包括: 1. **依赖注入(Dependency ...

    Hibernate对数据库操作的一些理解.pdf

    例如,通过将事务传播属性设为`REQUIRED`,如果当前没有事务,Spring会在调用方法前开启一个新的事务;如果已有事务,则加入到当前事务中。`Session`的创建与关闭通常伴随着数据库连接的建立与断开,而`commit()`会...

    hibernate spring 面试题精选

    - **load()**:尝试从缓存中加载对象,如果缓存中没有,则发起数据库查询,但该方法会抛出异常,如果找不到对象。 - **get()**:与load()类似,但不会抛出异常,而是返回null。 #### 6. Spring AOP(面向切面编程)...

    Hibernate持久化对象的生命周期

    Session的多种方法如`save()`, `load()`, `get()`, `find()`, `update()`, `saveOrUpdate()`, `lock()`等可以将对象转变为持久化状态。 3. **离线对象(Detached Objects)**: - 离线对象是曾经是持久化对象,但...

    spring笔记

    在Hibernate中,对象有三种状态:瞬时态(transient)、持久态(persistent)和脱管态(detached)。瞬时态是指new出来的对象,尚未与Hibernate Session关联。持久态是指已经被Hibernate Session管理的对象。脱管态...

    HibernateDaoSupport.docx

    【HibernateDaoSupport】是Spring框架中的一个抽象类,主要用于简化Hibernate的数据访问操作,它为DAO层提供了方便的事务管理和Session管理。这个类是Spring与Hibernate集成的重要组件,尤其对于初学者来说,理解其...

    Hibernate中对象的三种状态

    Session提供了事务管理和缓存功能,确保了对象状态的正确管理。例如,一级缓存(First Level Cache)自动管理持久态对象,而二级缓存(Second Level Cache)则可跨Session共享数据,提高性能。 6. HQL与 Criteria ...

    hibernate对象三种状态

    在Java的持久化框架Hibernate中,对象存在三种不同的状态,分别是持久态(Persistent)、自由态(Transient)和游离态(Detached)。这三种状态分别对应了对象与数据库的关联程度,理解它们对于高效地使用Hibernate...

    Hibernate三种状态

    例如,创建一个Customer对象,将其保存,然后通过load()方法再次获取该对象,即使没有显式调用update(),对象的更改也会在事务提交时更新到数据库。持久对象始终与Session和Transaction相关联,其状态在Transaction...

    SSH(struts+spring+hibernate)面试题总结

    `Session.save()`, `Session.load()`, `Session.get()`等方法会将对象置于持久化状态。 - **游离状态(Detached)**:对象不再在Session缓存中,但数据库可能仍有记录。关闭Session或调用`Session.evict()`会使得对象...

    对象状态到管理,很好的word文档

    在实际开发中,通常在事务的边界进行对象状态的转换,如在事务提交时(`s.getTransaction().commit();`)或在需要强制同步时调用`flush()`。此外,一些查询操作也可能触发Session的自动刷新,以保证数据的准确。

    hibernate的各种保存方式的区别以及hibernate对象的三种状态[定义].pdf

    通过Session的save()、get()或load()方法可以将对象设置为持久化状态。 - Detached(游离):持久化对象在Session关闭后,就会变为游离状态。这时,对象与Session断开,但其仍然包含数据库中的数据副本。更新游离...

    Hibernate Session 4种对象状态.docx

    Hibernate将对象的状态划分为四种:临时状态、持久化状态、游离状态和删除状态。这些状态反映了对象与数据库记录之间的关系,有助于理解Hibernate如何管理和操作数据。 1. **临时状态(Transient State)**: 当一...

Global site tag (gtag.js) - Google Analytics