hibernate没有在spring mvc中更新

时间:2014-09-20 14:59:46

标签: java spring hibernate spring-mvc

我有一个问题,我的项目是基于spring mvc与hibernate.in集成的。此更新无法正常工作.. 的

   @Override
        public void updateAuditorium(Auditorium auditorium) {
        openSession().update(auditorium);
    }

服务

@Transactional
    public void update(Auditorium auditorium) {
    auditoriumDAO.updateAuditorium(auditorium);

    }

构造

<beans:bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <beans:property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <beans:property name="url" value="jdbc:mysql://localhost:3306/auditoriumbooking" />
        <beans:property name="username" value="root" />
        <beans:property name="password" value="root" />
    </beans:bean>

    <!-- Hibernate 4 SessionFactory Bean definition -->
    <beans:bean id="hibernate4AnnotatedSessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <beans:property name="dataSource" ref="dataSource" />
        <beans:property name="packagesToScan">
            <beans:list>
                <beans:value>com.company.product.model</beans:value>
            </beans:list>
        </beans:property>
        <beans:property name="hibernateProperties">
            <beans:props>
                <beans:prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect
                </beans:prop>
                <beans:prop key="hibernate.show_sql">true</beans:prop>
            </beans:props>
        </beans:property>
    </beans:bean>

执行注意事项后执行功能。

2 个答案:

答案 0 :(得分:1)

所有插入/更新功能必须在事务中

    Session session = sessionFactory.openSession();
    Transaction tx = session.beginTransaction();

    //update/insert operations here

    session.update(auditorium);

    tx.commit();

    session.close();

如果您自己处理会话(factory.openSession()),那么您可以在没有事务的情况下执行只读操作。但是,如果在hibernate配置文件中配置会话处理,则hibernate将为您打开和关闭会话,即使是只读操作也需要事务处理。在这种情况下,你必须写factory.getCurrentSession()。该事务是强制性的,因为hibernate在检测到事务结束时会自动关闭会话。

答案 1 :(得分:0)

由于您正在使用sessionFactory,因此必须使用Transaction进行数据库操作。 您必须创建会话,然后在会话中开始事务并执行数据库操作,然后通过提交事务将其保存到数据库

Transaction transaction = null;
Session session = null;
try {
    //create the session object with openSession() and then begin transaction on session         
    session = sessionFactory().openSession();
    transaction = session.beginTransaction();
    session.update(auditorium);
    transaction.commit();

} catch(HibernateException e) {
    transaction.rollback();
} finally {
    session.close();
}

编辑: 编辑问题后:

您正在使用@Trasactional注释。 所以你必须创建一个HibernateTransactionManager bean(如果没有创建)并使用

<tx:annotation-driven/>

创建HibernateTransactionManager&amp;在

中定义<tx:annotation-driven/>
  

应用context.xml中