Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过JDBC更新进行的更改在顺序JDBC select中不可见_Java_Database_Jdbc - Fatal编程技术网

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。在启动、运行和验证测试时,使用您的生产架构创建它,然后将它吹走。