Hibernate更新实体行失效咨询:是否仅可通过EntityManager或Session操作?
Hibernate实体修改未生效的原因及解决办法
你的问题核心在于实体的状态——Hibernate只有当实体处于持久化(托管)状态时,修改属性才会自动同步到数据库。不是必须显式调用EntityManager/Session的update方法,但要满足关键前提:
为什么当前代码不生效?
大概率是retrieveById方法执行完毕后,对应的Session/EntityManager已经被关闭,此时获取到的product对象处于游离状态(不再被Hibernate托管),修改它的属性自然不会同步到数据库。
解决方式
在同一个Session/事务上下文内完成查询+修改
确保获取实体和修改属性的操作处于同一个活跃的Session或事务中。比如调整代码结构:// 开启Session与事务 Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); ProductDao productDao = new ProductDaoImpl(session); Product product = productDao.retrieveById(1); product.setName("TV 4k"); // 事务提交时,Hibernate会自动同步持久化实体的修改到数据库 tx.commit(); session.close();手动同步游离实体
如果实体已经处于游离状态,可以通过EntityManager或Session的API强制同步:// 使用EntityManager的merge方法 entityManager.merge(product); // 或者使用Session的update方法 session.update(product);注意:merge方法会返回一个新的持久化实体对象,原对象依然是游离状态;update则直接将游离实体重新纳入Session托管。
检查事务配置
确保你的操作处于事务范围内。Hibernate默认不会自动提交非事务环境下的修改,即使实体处于持久化状态,没有事务的话,修改也不会被写入数据库。
内容的提问来源于stack exchange,提问作者nowheresTraveller
相关产品推荐
相关产品推荐

