java - Hibernate 更新查询第二次不起作用

标签 java spring hibernate

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

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

对于映射,我使用注释配置,@Transactional 绑定(bind)在服务层,

Spring 配置文件中的 Hibernate 配置:

    <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();
}

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

关于java - Hibernate 更新查询第二次不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30613948/

相关文章:

java - 为什么这个算法在追踪时没有意义?

java - 如何删除数组中的最小值?

java - Hibernate 和 Criteria API 返回对象数组而不是元组

hibernate - hibernate 状态下对未保存值属性的需求是什么?

java - Hibernate:无法急切地获取子集合的子集合

java - 当附加(非模式)窗口关闭时,如何防止将主应​​用程序窗口置于前面。 Mac 操作系统、JavaFX

java - jdbcTemplate 如何执行更新语句并返回变量

java - 使用 Spring EntityManager,使用 DBCP 测试死锁

java - Spring Boot 从应用程序属性中读取值

java - 了解 Java 中的类型删除