hibernate spring session会在一段时间后回滚更新

时间:2014-03-25 16:48:21

标签: java sql spring hibernate c3p0

我运行我的tomcat应用程序 - spring3 + hibernate3(mysql)。 Hibernate创建会话。我对插入没有问题。 但之后我试图在sql IDE(例如sql developer)中进行更新

更新t_user set password ='123',其中id = 1;

行更新但是(!)我的更新 在一段时间后回滚 。 我认为它会在会话刷新时发生。如果我错了,请修理我。

此外,我正尝试通过java代码执行具有不同变体的更新。

例如:

@Override
public void addUser(User u) {
    sessionFactory.getCurrentSession().save(u);
}

sessionFactory.getCurrentSession().update(u);

sessionFactory.getCurrentSession().saveOrUpdate(u);

因此,在我的数据库中进行更新的唯一机会是停止我的应用程序并执行查询。

我认为该会话可能配置错误:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="${jdbc.driverClassName}"/>
    <property name="jdbcUrl" value="${jdbc.databaseurl}"/>
    <property name="user" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>

    <property name="minPoolSize" value="1"/>
    <property name="maxPoolSize" value="15"/>
    <property name="maxStatements" value="100"/>
    <property name="maxIdleTime" value="120"/>
    <property name="testConnectionOnCheckout" value="true"/>
    <property name="idleConnectionTestPeriod" value="300"/>
</bean>

<bean id="sessionFactory"
      class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="configLocation">
        <value>classpath:hibernate.cfg.xml</value>
    </property>
    <property name="configurationClass">
        <value>org.hibernate.cfg.AnnotationConfiguration</value>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl}</prop>
        </props>
    </property>

</bean>

我也尝试刷新会话:

sesion.flush();

我在hibernate.cfg.xml文件中有这样的属性:

 <property name="hibernate.flushMode">ALWAYS</property>

或许是mysql的问题...... 有没有人遇到过这个问题? 请指教。

更新: 我正在使用事务管理器:

<bean id="transactionManager"
      class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

hibernate.cfg.xml中:

   <?xml version='1.0' encoding='utf-8'?>
   <!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>        
        <property name="hibernate.flushMode">ALWAYS</property>       

        <mapping class="com.dao.model.user.User"/>        

    </session-factory>
</hibernate-configuration>

1 个答案:

答案 0 :(得分:0)

您错过了实际的事务划分,以便Spring可以创建SessionFactory应该使用的事务上下文。

常规用例

例如,您可以使用@Transactional注释事务方法并使用<tx:annotation-driven/>触发其处理,因为您已经在使用XML配置(@EnableTransactionManagement如果您使用的是java配置)

您不应该自己致电flush,因为基础设施会在默认需要时自动执行此操作。

查看文档的transaction management section以获取更多信息。

在视图中打开会话

您也可以将这一切与OpenSessionInViewFilter结合使用。在这种情况下,同样的原则也适用:对于您的请求打开会话是不够的,请从the javadoc of OpenSessionInViewFilter查看此说明:

  

注意:默认情况下,此过滤器不会刷新Hibernate会话,刷新模式设置为FlushMode.NEVER。它假定与关注刷新的服务层事务结合使用:活动事务管理器将在读写事务期间临时将刷新模式更改为FlushMode.AUTO,并在最后将刷新模式重置为FlushMode.NEVER每笔交易。如果您打算在没有事务的情况下使用此过滤器,请考虑更改默认刷新模式(通过&#34; flushMode&#34;属性)。

因此,您需要将您的方法标记为事务性,以便Spring的事务抽象可以在需要时接管并刷新。为您的事务方法添加@Transactional并通过<tx:annotation-driven/>启用其处理可能是您需要做的唯一事情。请首先阅读文档,了解何时需要添加此注释。