Java 通过JDBC更新进行的更改在顺序JDBC select中不可见
我有一个这样结构的代码(有很多类,但模式是这样的:Java 通过JDBC更新进行的更改在顺序JDBC select中不可见,java,database,jdbc,Java,Database,Jdbc,我有一个这样结构的代码(有很多类,但模式是这样的: void f() { MyObj o = db.getById(id); o.setField1(value); db.update(o); o = db.getById(id); assertEquals(value, o.getField()); } update和get方法使用相同的数据源,与Spring一起使用。get通过JdbcTemplate工作,而update只需要从数据源获取连接并使用原始JDBC
void f() {
MyObj o = db.getById(id);
o.setField1(value);
db.update(o);
o = db.getById(id);
assertEquals(value, o.getField());
}
update和get方法使用相同的数据源,与Spring一起使用。get通过JdbcTemplate工作,而update只需要从数据源获取连接并使用原始JDBC。
更新标记为@Transactional annotation。
以下是Spring配置中transacion manager的定义:
<tx:annotation-driven transaction-manager="TransactionManager"/>
<bean id="TransactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
问题是,如果我使用update,并且在它进入webservice方法的不同调用之后,使用它们的方法,例如,结果是正确的,我得到了更新的值。
若我在更新后在一个单元测试方法中顺序调用它们,我看不到更新后的值。
我不能在这里发布整个读/写代码,因为它很大,并且被分割成许多文件,但是您可能对如何修复它有一些想法。
谢谢。您必须先刷新更新,然后才能在“选择”窗口中看到它。您可以尝试
entityManager.refresh(yourEntity);
这样,您将在这一行之后得到您最近使用的entities实例。duffymo,我知道如何刷新hibernate会话,但如何刷新连接?Update方法包括在不同类中对jdbc的许多调用(数据更新、审计更新、存储过程调用)。它们都在不同的类中,并拥有自己的连接。我无法在每次更新操作后提交,因为如果在任何步骤中出现故障,我希望回滚所有更改(这就是为什么我对整个方法有一个事务性注释)。此外,如果该方法与@Transactional一起使用,是否足以使其所有更改可见?也许您需要尝试另一个方向:在没有事务管理器的情况下对测试数据库使用Hyperion。在启动、运行和验证测试时,使用您的生产架构创建它,然后将它吹走。