我正在尝试通过Hibernate HQL查询更新记录,但导致继续加载页面。

第一次尝试更新记录没有任何问题。

对于Mapping,我使用的是注释配置,@ Transactional在服务层绑定,

Spring配置文件中的Hibernate Configuration:

    <mvc:annotation-driven/>
    <tx:annotation-driven />
    <context:component-scan base-package="com.spring.datasolr"/>

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:application.properties</value>
                <value>classpath:db.properties</value>
            </list>
        </property>
    </bean>

    <mvc:resources mapping="/resources/**" location="/WEB-INF/resources/"/>

    <!-- Configures spring view resolver -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!-- Configures validation message property file -->
    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename" value="/WEB-INF/messages"></property>
    </bean>

        <!-- Configures database property -->
        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
            <property name="driverClassName" value="${jdbc.driverClassName}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        </bean>

        <!-- Configures Hibernate Sessionfactory -->
        <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
            <property name="dataSource" ref="dataSource"/>
            <property name="packagesToScan">
                <list>
                    <value>com.spring.datasolr.model</value>
                </list>
            </property>

            <property name="hibernateProperties">
                <props>
                    <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                    <prop key="hibernate.show_sql">true</prop>
                    <!-- <prop key="hibernate.hbm2ddl.auto">create</prop> -->
                </props>
            </property>
        </bean>

        <!-- Configures Hibernate Transaction Management -->
        <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
            <property name="sessionFactory" ref="sessionFactory"/>
        </bean>


道课:

@Autowired
    SessionFactory sessionFactory;

    private Session getSession(){
        return sessionFactory.openSession();
    }

    @Override
        public void update(User user) {
        System.out.println("User ID :: "+user.getId());
        Query query = getSession().createQuery("UPDATE User SET name=:name, email=:email, message=:message WHERE id=:id");
        query.setParameter("name", user.getName());
        query.setParameter("email", user.getEmail());
        query.setParameter("message", user.getMessage());
        query.setParameter("id", user.getId());
        query.executeUpdate();
        //sessionFactory.openSession().saveOrUpdate(user);
    }


服务层:

@Transactional
@Service(value = "userService")
public class UserServiceImpl implements UserService {
    @Autowired
    UserDAO userDao; // This is for database

    @Autowired
    SolrTemplate solrTemplate;

    @Resource
    private UserRepository userRepository; // This is for solr

    @Override
    public void updateDocument(Object obj) {
        User user =(User) obj;
        userDao.update(user);

        //solr repository, save all user in solr indexing
        userRepository.save(userDao.userList());
    }
}

最佳答案

您的交易环境不起作用。用这个:

@Override
public void update(User user) {
    System.out.println("User ID :: "+user.getId());
    Session s = getSession();
    Transaction t = s.beginTransaction();
    Query query = s.createQuery("UPDATE User SET name=:name, email=:email, message=:message WHERE id=:id");
    query.setParameter("name", user.getName());
    query.setParameter("email", user.getEmail());
    query.setParameter("message", user.getMessage());
    query.setParameter("id", user.getId());
    query.executeUpdate();
    t.commit();
}


因为:如果您两次调用它,则第一次尝试成功,但是该事务永远不会关闭。因此,更改是在事务中,但尚未在数据库中。如果您从会话中读取内容,则它首先查看当前事务的更改,因此您认为它们已存储,但仅存在于事务中。

10-04 22:26
查看更多