session.update未在db

时间:2015-06-05 20:40:47

标签: java spring hibernate jsp spring-mvc

我有一个jsp页面,我从控制器发送一个模型属性,之后对模型属性的属性进行了一些更改。它反映了模型属性,但没有在数据库中更新。我的代码是 -

spring-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="
         http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context-4.0.xsd
         http://www.springframework.org/schema/tx
         http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
         http://www.springframework.org/schema/aop
         http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
         http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">

<mvc:annotation-driven /> 
<context:component-scan base-package="com.vc.teacher" />
<tx:annotation-driven transaction-manager="transactionManager"/>


<!-- Configuration defining views files -->

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix">
            <value>/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
</bean>



<bean id="transactionManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>

    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="annotatedClasses">
            <list>
                <value>com.vc.teacher.entities.User</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
                <!--  <prop key="hibernate.current_session_context_class">thread</prop> -->
                <prop key="show_sql">true</prop>
                <prop key="format_sql">true</prop>
                <prop key="use_sql_comments">true</prop>
            </props>
        </property>
    </bean>



    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost:3306/teacher"></property>
        <property name="username" value="root"></property>
        <property name="password" value="root"></property>
    </bean>

</beans>

AccountContoller类

package com.vc.teacher.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import com.vc.teacher.db.dao.UserDao;
import com.vc.teacher.entities.User;

@Controller
public class AccountController {

    @Autowired
    UserDao userDao;

    @RequestMapping("/login")
    public String loginUser(@RequestParam("email") String email,
            @RequestParam("password") String password, Model model) {

        User user = userDao.checkCreditionals(
                email, password);
        if (user != null) {
            model.addAttribute("user", user);
            System.out.println("id=============================="+user.getId());
            return "jsp/profile";
        } else {
            model.addAttribute("error", "Wrong creditionals");
            return "jsp/signin";
        }

    }

    @RequestMapping("/signUp")
    public String initilize(Model model) {
        model.addAttribute(new User());
        return "jsp/signup";
    }

    @RequestMapping(method = RequestMethod.POST, value = "/register")
    public String signUpUser(User user, RedirectAttributes attributes) {
        boolean result = false;


        user.setStatus("Deactive");
        result = userDao.registerUser(user);

        if (result == true) {
            attributes.addFlashAttribute("message", "You are ready to go now !");
            return "redirect:/signUp";
        } else {
            attributes.addFlashAttribute("message", "Something went wrong");
            return "redirect:/signUp";
        }

    }

    @RequestMapping(method = RequestMethod.POST, value = "/update")
    public String updateUser(User user, RedirectAttributes attributes) {
        boolean result = false;

        System.out.println("====================================================="+user.getFirstName());
        System.out.println("============================================="+user.getEmail());
        System.out.println("============================================"+user.getId());

        user.setStatus("Active");
        result = userDao.updateUser(user);

        if (result == true) {
            attributes.addFlashAttribute("message", "Profile Updated !");
            return "jsp/profile";
        } else {
            attributes.addFlashAttribute("message", "Something went wrong");
            return "jsp/profile";
        }

    }
}

profile.jsp

<div class="form-group">
        <label for="inputEmail3" class="col-md-2 control-label">Full Name</label>
        <div class="col-md-8">
            <div class="row">
                <div class="col-md-6">
                    <div class="form-control-material">
                        <sf:input path="firstName" type="text" class="form-control" id="firstName" placeholder="Your first name" value="${user.firstName}" />

                        <label for="firstName">First name</label>
                    </div>
                </div>
                <div class="col-md-6">
                    <div class="form-control-material">
                            <sf:input path="lastName" class="form-control" id="lastName" placeholder="Your last name" value="${user.lastName}" />
                        <label for="lastName">Last name</label>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="form-group">
        <label for="inputEmail3" class="col-md-2 control-label">Email</label>
        <div class="col-md-6">
            <div class="form-control-material">
                <div class="input-group">
                    <span class="input-group-addon"><i class="fa fa-envelope"></i></span>
                    <sf:input path="email" type="email" class="form-control" id="inputEmail3" placeholder="Email" value="${user.email}" />
                    <label for="inputEmail3">Email address</label>
                </div>
            </div>
        </div>
    </div>
     <div class="form-group">
        <label for="inputEmail3" class="col-md-2 control-label">Phone</label>
        <div class="col-md-6">
            <div class="form-control-material">
                <div class="input-group">
                    <span class="input-group-addon"><i class="fa fa-envelope"></i></span>
                    <sf:input path="phone" type="number" class="form-control" id="inputEmail3" placeholder="Phone" value="${user.phone}" />
                    <label for="phone">Phone</label>
                </div>
            </div>
        </div>
    </div>
    <div class="form-group">
        <label for="inputEmail3" class="col-md-2 control-label">Address</label>
        <div class="col-md-6">
            <div class="form-control-material">
                <div class="input-group">
                    <span class="input-group-addon"><i class="fa fa-link"></i></span>
                    <sf:input path="address" type="text" class="form-control used" id="website" placeholder="Address" value="${user.address}" />
                    <label for="address">Address</label>
                </div>
            </div>
        </div>
    </div>
    <div class="form-group">
        <label for="inputPassword3" class="col-md-2 control-label">Change Password</label>
        <div class="col-md-6">
            <div class="form-control-material">
               <sf:input path="password" type="password" class="form-control" id="inputPassword3" placeholder="Password" value="${user.password}" />
                <label for="password">Password</label>
            </div>
        </div>
    </div>

    <div class="form-group margin-none">
        <div class="col-md-offset-2 col-md-10">
            <button type="submit" class="btn btn-primary paper-shadow relative" data-z="0.5" data-hover-z="1" data-animated>Save Changes</button>
        </div>
    </div>
</sf:form>

UserDao类

package com.vc.teacher.db.dao;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import com.vc.teacher.entities.User;

@Component
public class UserDao {


    @Autowired
    SessionFactory sessionFactory;

    public SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    @Transactional
    public User checkCreditionals(String email, String password){
        User user = null;
        Session session  =  sessionFactory.getCurrentSession();
        Query query =   session.createQuery("from User where email = '"+email+"' and password = '"+password+"'");
        List list   =   query.list();
        if(list.size()>0)
            user =  (User)list.get(0);

        return user;
    }

    @Transactional
    public boolean registerUser(User user){
        boolean result = false;
        Session session = sessionFactory.getCurrentSession();
        try{
            user.setUserTypeId(2);
            session.save(user);

            result = true;
        } catch (Exception e){
            result = false;
            e.printStackTrace();
        }

        return result;
    }

    @Transactional
    public boolean updateUser(User user){
        boolean result = false;
        Session session = sessionFactory.getCurrentSession();
        try{
            user.setUserTypeId(2);
            session.update(user);

            result = true;
        } catch (Exception e){
            result = false;
            e.printStackTrace();
        }

        return result;
    }

}

这里我使用 AccountController 类中的登录方法登录并添加模型属性用户并在配置文件jsp页面中对此对象进行更改,并在提交表单后显示jsp页面中的更改但不更新数据库中的更改。有时这个例外也来了 -

 org.springframework.orm.hibernate4.HibernateOptimisticLockingFailureException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1; nested exception is org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1

at org.springframework.orm.hibernate4.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:205)

at org.springframework.orm.hibernate4.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:730)

at org.springframework.orm.hibernate4.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:592)

at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:757)

at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:726)

at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:521)

at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:291)

at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)

at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653)

at com.vc.teacher.db.dao.UserDao$$EnhancerBySpringCGLIB$$467fa027.updateUser(<generated>)

at com.vc.teacher.controller.AccountController.updateUser(AccountController.java:97)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

at java.lang.reflect.Method.invoke(Unknown Source)

at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)

at org.springframework.web.method.support.InvocableHandlerMethod.invokeFor

有什么问题?

2 个答案:

答案 0 :(得分:1)

您应首先加载用户,然后更新用户属性。

您的代码会是这样的:

 @Transactional
    public boolean updateUser(User user){
        boolean result = false;
        Session session = sessionFactory.getCurrentSession();
        try{

            User useToUpdate = session.get(user.getId());

            useToUpdate.setUsername(user.getUsername());

            ...

            result = true;
        } catch (Exception e){
            result = false;
            e.printStackTrace();
        }

        return result;
    }

Hibernate将在提交事务时保留更改,因此您无需致电session.update(user);

答案 1 :(得分:0)

我检查了我的代码,发现我的用户对象将id设为0,这就是更新时出现异常的原因。我在表单中的jsp页面上设置了id并发出了我的问题。