Rumah  >  Soal Jawab  >  teks badan

java - hibernate交spring事物托管后插入数据无效,不发送sql语句,不报错,但能查询到数据。

hibernate交spring事务托管后插入数据无效,不发送sql语句,不报错,但能查询到数据。
如果手动执行sessionFactory.getCurrentSession().flush()可以立即写入到数据库。
不手动的话无法自动事务提交。
怀疑是spring事务管理没起作用。
(学生党刚学框架,不妥当的地方还请明示)

dao层代码:

public class UserDao implements IUserDao{
    private SessionFactory sessionFactory;
    public SessionFactory getSessionFactory() {
        return sessionFactory;
    }
    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }
    public boolean addUser(User user) {
        LogUtil.getLog().info("正在执行user插入操作~");
        try {
            sessionFactory.getCurrentSession().save(user);
        } catch (Exception e) {
            LogUtil.getLog().error(e);
            return false;
        }
        return true;
    }

controller层:

if(code.equals(checkCode)){
            if(userDao.addUser(user)){
                //将用户信息加进session中
                return "redirect:/returnIndex";
            }else{
                model.addAttribute("message", "系统异常,注册失败!");
                return "forward:/user/returnRegiste";
            }
        }else{
            model.addAttribute("message", "验证码错误!");
            return "forward:/user/returnRegiste";
        }

xml配置:

 <!-- c3p0数据源 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
       destroy-method="close">
        <property name="user"><value>root</value></property>
        <property name="password"><value></value></property>
        <property name="minPoolSize"><value>20</value></property>
        <property name="maxPoolSize"><value>100</value></property>
        <property name="initialPoolSize"><value>20</value></property>
        <property name="driverClass"><value>com.mysql.jdbc.Driver</value></property>
        <property name="jdbcUrl"><value>jdbc:mysql://localhost:3306/db_shop?useUnicode=true&amp;characterEncoding=UTF-8</value></property>
    </bean>
    <!-- session工厂 -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="annotatedClasses">
            <list>
                <value>edu.hnuc.entity.User</value>
            </list>
        </property>
        <property name="dataSource" ref="dataSource"></property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.dialect">edu.hnuc.util.UTF8CharacterDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
            </props>
        </property>
    </bean>
    <!-- 事务管理器 -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
    <!-- 通知 -->
    <tx:advice id="myAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="get*" read-only="true"/>
            <tx:method name="*" />
        </tx:attributes>
    </tx:advice>
    <!-- 切入点 -->
   <aop:config>
           <aop:pointcut expression="execution(* edu.hnuc.dao.impl.*.*(**))" id="myPoincut"/>
           <aop:advisor advice-ref="myAdvice" pointcut-ref="myPoincut"/>
   </aop:config>
   <!-- openSessionInView -->
   <mvc:interceptors>
        <bean class="org.springframework.orm.hibernate4.support.OpenSessionInViewInterceptor">
                <property name="sessionFactory" ref="sessionFactory"></property>
        </bean>
   </mvc:interceptors>
   
   
   

文件结构:

黄舟黄舟2712 hari yang lalu635

membalas semua(2)saya akan balas

  • PHPz

    PHPz2017-04-18 09:47:13

    Tiada transaksi yang dikonfigurasikan dalam fail konfigurasi anda, bagaimanakah ia boleh diserahkan secara automatik? Anda pastinya perlu menyerahkan sendiri transaksi dalam kod secara manual
    Cara paling mudah ialah ini

    <tx:annotation-driven transaction-manager="transactionManager" />
        <bean id="transactionManager"
            class="org.springframework.orm.hibernate3.HibernateTransactionManager">
            <property name="sessionFactory" ref="sessionFactory" />
        </bean>

    Kemudian tambahkan @Transactional pada kaedah dao anda
    Kemas kini jawapan dalam ulasan

    Tulis seperti ini

    <aop:pointcut expression="execution(* edu.hnuc.dao.impl.*.*(..))" id="myPoincut"/>

    balas
    0
  • ringa_lee

    ringa_lee2017-04-18 09:47:13

    1 Memandangkan springMVC dan hibernate digunakan, mengapa tidak menggunakan templat hibernate spring?

    2. Fail konfigurasi musim bunga anda mengkonfigurasi sessinFactory dan transactionManager, tetapi DAO anda memperoleh sesi daripada sessionFactory itu sendiri, dan tiada kod kawalan transaksi yang berkaitan... Saya rasa kerana ini transaksi tidak diserahkan. Ia seperti jika anda menggunakan kolam sambungan, tetapi buat sambungan sendiri menggunakan JDBCDriver, maka kolam sambungan pasti tidak akan dapat menguruskan Sambungan ini, kerana ia tidak tahu pun ada sambungan sedemikian...

    Akhir sekali, saya ingin memberi anda cadangan: Dalam fasa penyahpepijatan kod, adalah lebih baik untuk menambah e.printStackTrace(), dan yang terbaik adalah menambah throw e, supaya kod huluan mengetahui bahawa terdapat adalah masalah dalam lapisan ini. Jika tidak, ia mungkin disebabkan oleh faktor manusia (seperti terlupa untuk menulis "LogUtil.getLog().error(e);" atau lain-lain) menyebabkan mesej pengecualian ditelan. Jika pengecualian sedemikian berlaku, mencari masalah akan menjadi sangat menyusahkan.

    balas
    0
  • Batalbalas