gpt4 book ai didi

java - 为什么 HibernateTemplate.merge() 会毫无异常地完成但不保留数据?

转载 作者:行者123 更新时间:2023-11-30 02:45:33 25 4
gpt4 key购买 nike

我想让这个问题尽可能通用,而不需要提交大量的代码和配置示例,以便答案提交者可以涵盖广泛的可能性,因此使其具有一定的“学术性”。

我有两个实体类,FooBar。它们使用 JPAHibernate 作为提供者连接到持久性存储(在我的例子中是 PostgreSQL,但我认为这不重要)。它们分别由 FooDaoBarDao 管理,并且两个 DAO 都扩展了包含 save 方法的 BaseDao:

public T save(T object)
{

return (T) hibernateTemplate.merge(object);
}

这两个 DAO 都不会覆盖(这意味着它们按原样使用父类(super class)方法)。

问题是,当我调用 myFooDao.save(myFoo) 时,它实际上将对象保存到数据库中,但是当我调用 myBarDao.save(myBar) 时,该对象未持久化,尚未抛出异常

所有这些都在 Spring 上下文中运行,并且两个 DAO 都是 injected 。我还应该添加两个表的主键,每个表都与其自己的序列相关联。虽然 Bar 插入实际上从未被持久化,但关联的序列每次都会递增,这很奇怪。因此,Hibernate 确实准备了一个事务,但从序列中获取下一个值,这会增加序列,但新行永远不会显示在数据表中。

我希望探索一些可能发生异常的一般情况。其一,配置是否设置为自动提交 Foo 而 Bar 不是,我应该深入上下文配置以查找差异?或者 Hibernate 是否认为写入已成功提交,因为数据库引擎未正确报告失败?

最佳答案

Hibernate 不一定会在每次更新查询后保留您的更改(例如 saveOrUpdatemerge)。

它的持久性行为是由与 HibernateTemplate 关联的 session 的 FlushMode 定义的。此处描述了可能的 FlushMode:https://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/FlushMode.html

默认情况下,Hibernate session 设置为 FlushMode.AUTO。这意味着,如果后续查询不是绝对明确地需要(以维护数据库一致性),则不会进行任何持久更改,除了通过迭代序列分配 id 之外。

这是你观察到的结果。

要回答您的问题,如果您想在合并后立即保留更改,您将需要:

1) 在合并之前(或实例化 HibernateTemplate 时),将与 HibernateTemplate 绑定(bind)的 session 的刷新策略更改为“ALWAYS”。

hibernateTemplate.setFlushModeName("FLUSH_ALWAYS");

2) 合并后显式刷新 session 。

hibernateTemplate.flush();

但您还应该注意,HibernateTemplate 是一种已弃用的使用 Hibernate 与数据库交互的方法,特别是因为 HibernateTemplate 不会引导人们正确处理数据库事务。

首先,当使用 FlushMode.AUTO 提交事务时,事务中使用的合并将自动保留。

在 Spring 应用程序中,您可以使用 @Transactional 注解,它通过事务隐式执行注解方法中包含的所有逻辑。

@Autowired
private SessionFactory sessionFactory;

@Transactional
public void doUpdate(Object myObject) {
Session hibSession = sessionFactory.getCurrentSession();
hibSession.merge(myObject);
}

在这里查看有关 Spring 事务管理的完整说明:http://docs.spring.io/spring-framework/docs/4.2.x/spring-framework-reference/html/transaction.html (@Transactional 注释的 16.5.6 段落)。

关于java - 为什么 HibernateTemplate.merge() 会毫无异常地完成但不保留数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40293795/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com