java - hibernate交spring事物托管后插入数据无效,不发送sql语句,不报错,但能查询到数据。
黄舟
黄舟 2017-04-18 09:45:13
0
2
633

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>
   
   
   

文件结构:

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

répondre à tous(2)
PHPzhong

Il n'y a aucune transaction configurée dans votre fichier de configuration, comment peut-elle être soumise automatiquement ? Vous devez absolument soumettre vous-même manuellement la transaction dans le code
Le moyen le plus simple est le suivant

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

Ensuite, ajoutez @Transactional à votre méthode dao
Mettez à jour la réponse dans le commentaire

Écrivez comme ça

<aop:pointcut expression="execution(* edu.hnuc.dao.impl.*.*(..))" id="myPoincut"/>
左手右手慢动作

1. Puisque springMVC et hibernate sont utilisés, pourquoi ne pas utiliser le hibernateTemplate de spring ?

2. Votre fichier de configuration Spring configure sessinFactory et transactionManager, mais votre DAO obtient la session de sessionFactory lui-même, et il n'y a pas de code de contrôle de transaction pertinent... Je pense que c'est à cause de cela que la transaction n'est pas soumise. C'est comme si vous utilisiez un pool de connexions, mais créiez vous-même une connexion à l'aide de JDBCDriver, alors le pool de connexions ne pourra certainement pas gérer cette connexion, car il ne sait même pas qu'une telle connexion existe...

Enfin, je voudrais vous faire une suggestion : dans la phase de débogage du code, il est préférable d'ajouter e.printStackTrace(), et il est préférable d'ajouter throw e, afin que le code en amont sache qu'il y a Il y a un problème dans cette couche. Sinon, cela est probablement dû à une erreur humaine. Des facteurs (tels que l'oubli d'écrire "LogUtil.getLog().error(e);" ou autre) entraînent l'avalement du message d'exception. Si une telle exception se produit, la localisation du problème sera très fastidieuse.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!