BILL
BILL

Reputation: 4869

Entity not updating in Hibernate

I want to create a simple web page with CRUD logic using Spring MVC and Hibernate. I created this simple UserController:

my spring config [up] :

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:c="http://www.springframework.org/schema/c"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">

    <!-- Root Context: defines shared resources visible to all other web components -->
    <context:annotation-config />
    <context:component-scan base-package="org.vdzundza.dao" />
    <context:component-scan base-package="org.vdzundza.service" />

    <bean id="propertiesConfig"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
        p:location="/WEB-INF/jdbc.properties" />

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <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>

    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"
        lazy-init="true">
        <property name="dataSource" ref="dataSource" />
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.current_session_context_class">thread</prop> 
            </props>
        </property>
        <property name="packagesToScan" value="org.vdzundza.beans" />
    </bean>
<tx:annotation-driven/>
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory"><ref local="sessionFactory"/></property>
    </bean>
</beans>

My Controller:

package org.vdzundza.web;

import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.vdzundza.beans.User;
import org.vdzundza.service.UserService;

@Controller
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    private static final Logger logger = LoggerFactory
            .getLogger(UserController.class);    

    @RequestMapping(value = "/edit/{id}", method = RequestMethod.GET)
    public String updateUserGet(Map<String, Object> map, @PathVariable("id") Long id){
        User user = userService.loadUser(id);
        map.put("user", user);
        return "edit";
    }

    @RequestMapping(value = "/edit", method = RequestMethod.POST)
    public String updateUserPost(@ModelAttribute("user") User user, BindingResult result){
        logger.info("update user: " + user.toString());
        userService.updateUser(user);
        return "redirect:/user/index";
    }
}

My UserDAO:

package org.vdzundza.dao;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import org.vdzundza.beans.User;

@Repository
@Transactional(value = "transactionManager")
public class UserDAOImpl implements UserDao {

    @Autowired
    private SessionFactory sessionFactory;

    private static final Logger logger = LoggerFactory
            .getLogger(UserDAOImpl.class);


    public void updateUser(User user) {
        Session session = sessionFactory.getCurrentSession();
        Transaction tx = null;
        try {
            tx = session.beginTransaction();
            session.update(user);
            tx.commit();

        } catch (RuntimeException e) {
            tx.rollback();
        }
    }

    public User loadUser(Long id) {
        Session session = sessionFactory.openSession();
        return (User) session.load(User.class, id);
    }
}

and Service:

package org.vdzundza.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import org.vdzundza.beans.User;
import org.vdzundza.dao.UserDao;

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDAO;        

    @Transactional
    public void updateUser(User user) {
        userDAO.updateUser(user);

    }

    @Transactional
    public User loadUser(Long id) {
        return userDAO.loadUser(id);
    }
}

My simple form for updating:

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Update user</title>
</head>
<body>
    <form:form method="post"
        action="${pageContext.request.contextPath}/user/edit"
        commandName="user">
        <table>
            <tr>
                <td><form:label path="firstName">First Name</form:label></td>
                <td><form:input path="firstName" /></td>
            </tr>

            <tr>
                <td><form:label path="lastName">Last Name</form:label></td>
                <td><form:input path="lastName" /></td>
            </tr>

            <tr>
                <td><form:label path="network">network</form:label></td>
                <td><form:input path="network" /></td>
            </tr>
            <tr>
                <td colspan="2"><input type="submit" value="update user" /></td>
            </tr>

        </table>
    </form:form>
</body>
</html>

Why doesn't my "updateUser"(dao) method update the entity?

Upvotes: 0

Views: 3214

Answers (2)

BILL
BILL

Reputation: 4869

I add hidden element to form.

<form:hidden path="id"/>

Upvotes: 0

Raul Rene
Raul Rene

Reputation: 10280

Do a

session.flush();

after the

tx.commit();

The goal of the flush mechanism is to synchronize the state of your persistent objects that are in the session with the database.

If you change an object's state, the state will not reflect in the database. On flush hibernate synchronizes the database with the new state of your object.

Upvotes: 4

Related Questions