title: Persisting CGLIB proxy entity with HibernateTemplate
body: <p>I've searched almost everywhere but no one seems to had this problem.
  I have Spring MVC application.
  There is UserImpl entity which is declared as request scoped bean in context configuration file and referenced by UsersController. The UserImpl object referenced by UsersController is actually a CGLib proxy (<a href="http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/beans.html#beans-factory-scopes-other-injection" rel="nofollow" title="here is why">here</a> is why?). Now when i first tried to persist such proxy object with HibernateTemplate I got this error:</p>
  
  <blockquote>
    <p>org.hibernate.MappingException: Unknown entity:
    main.mvc.model.hibernate.UserImpl$$EnhancerByCGLIB$$9ac49631</p>
  </blockquote>
  
  <p>After some search I found something like:</p>
  
  <blockquote>
    <p>org.springframework.orm.hibernate3.support.ScopedBeanInterceptor</p>
  </blockquote>
  
  <p>which kinda solved the problem. Now I don't get MappingException and entity is persisted but... every field in database record is null. What's the problem?</p>
  
  <p>Note:
  When I hard code UserImpl instance and persist it with UserServiceImpl everything is OK.</p>
  
  <p>Part of context config:</p>
  
  <pre><code>&lt;bean id="userService" class="main.mvc.model.hibernate.UserServiceImpl"/&gt;
  &lt;bean id="userValidator" class="main.validators.UserValidator"/&gt;
  &lt;bean id="userWrapperValidator" class="main.validators.UserWrapperValidator"/&gt;
  &lt;bean id="user" class="main.mvc.model.hibernate.UserImpl" scope="request"&gt;
      &lt;aop:scoped-proxy/&gt;
  &lt;/bean&gt;
  &lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"&gt;
      &lt;property name="dataSource" ref="dataSource"/&gt;
      &lt;property name="packagesToScan" value="main.mvc.model.hibernate"/&gt;
      &lt;property name="entityInterceptor"&gt;
  &lt;bean class="org.springframework.orm.hibernate3.support.ScopedBeanInterceptor"/&gt;
      &lt;/property&gt;
      &lt;property name="hibernateProperties"&gt;
          &lt;props&gt;
              &lt;prop key="hibernate.dialect"&gt;org.hibernate.dialect.HSQLDialect&lt;/prop&gt;
              &lt;prop key="hibernate.show_sql"&gt;true&lt;/prop&gt;
              &lt;prop key="hibernate.hbm2ddl.auto"&gt;update&lt;/prop&gt;
          &lt;/props&gt;
      &lt;/property&gt;
  &lt;/bean&gt;
  </code></pre>
  
  <p>UsersController:</p>
  
  <pre><code>package main.mvc.controllers;
  
  import java.util.List;
  
  import javax.inject.Inject;
  import javax.validation.Valid;
  
  import main.helpers.UserWrapper;
  import main.mvc.model.User;
  import main.mvc.model.UserService;
  import main.mvc.model.hibernate.UserImpl;
  import main.validators.UserValidator;
  import main.validators.UserWrapperValidator;
  
  import org.apache.log4j.Logger;
  import org.springframework.stereotype.Controller;
  import org.springframework.ui.Model;
  import org.springframework.validation.BindingResult;
  import org.springframework.web.bind.WebDataBinder;
  import org.springframework.web.bind.annotation.InitBinder;
  import org.springframework.web.bind.annotation.ModelAttribute;
  import org.springframework.web.bind.annotation.RequestMapping;
  import org.springframework.web.bind.annotation.RequestMethod;
  import org.springframework.web.servlet.mvc.support.RedirectAttributes;
  
  
  @Controller
  @RequestMapping("/users")
  public class UsersController {
  
      private User user; // should be request-scoped
      private UserService userService;
      private UserValidator userValidator;
      private UserWrapperValidator userWrapperValidator;
  
      @SuppressWarnings("unused")
      private Logger logger = Logger.getLogger(getClass());
  
      @Inject
      public UsersController(User user, UserService userService, UserValidator userValidator, UserWrapperValidator userWrapperValidator){
          this.user = user;
          this.userService = userService;
          this.userValidator = userValidator;
          this.userWrapperValidator = userWrapperValidator;
      }
  
      @InitBinder("user")
      protected void setUserValidator(WebDataBinder binder){
          binder.setValidator(userValidator);
      }
  
      @InitBinder("userWrapper")
      protected void setUserWrapperValidator(WebDataBinder binder){
          binder.setValidator(userWrapperValidator);
      }
  
      @ModelAttribute
      public UserWrapper wrapUser(){
          return new UserWrapper(user);
      }
  
      //==================================REQUEST HANDLERS==========================================
  
      @RequestMapping(value={"/new"}, method=RequestMethod.GET)
      public String showCreationForm(@ModelAttribute UserWrapper userWrapper){
          return "user_registration_form";
      }
  
      @RequestMapping(method=RequestMethod.POST)
      public String createUser(@Valid @ModelAttribute UserWrapper userWrapper, BindingResult bindingResult, RedirectAttributes redirectAttributes){
          if(bindingResult.hasErrors()){
              return "user_registration_form";
          }
          userService.save(userWrapper.getUser());
          redirectAttributes.addFlashAttribute("message_title", "Jakiś text");
          redirectAttributes.addFlashAttribute("message_text", "Jakiś text");
          redirectAttributes.addFlashAttribute("redirect_url", "/users");
          return "redirect:information";
      }
  ...
  }
  </code></pre>
  
  <p>UserServiceImpl:</p>
  
  <pre><code>public class UserServiceImpl extends HibernateDaoSupport implements UserService {
  
      private PasswordEncoder passwordEncoder;
      private SaltSource saltSource;
  
      @Inject
      public UserServiceImpl(SessionFactory sessionFactory, PasswordEncoder passwordEncoder, SaltSource saltSource) {
          super();
          setSessionFactory(sessionFactory);
          setPasswordEncoder(passwordEncoder);
          setSaltSource(saltSource);
      }
  
      public void save(User user) {
          Date creationTime = new Date();
          user.setCreationDate(creationTime);
          user.setLastModified(creationTime);
  
          List&lt;Role&gt; roles = new LinkedList&lt;&gt;();
          roles.add(Role.ROLE_USER);
          user.setRoles(roles);
  
          Logger.getLogger(getClass()).info(user);
          getHibernateTemplate().save(user);
      }
  ...
  }
  </code></pre>
  
  <p><strong>Update</strong><br>
  Ok so I've added some AOP magic add output what happens to the entity object while processed in ScoppedBeanInterceptor. It's intact. Although Hibernate's BasicBinder is binding null values to the SQL statement. Any help?</p>
  
  <p>log:</p>
  
  <pre><code>11:27:51,866 DEBUG org.hibernate.SQL:111 - select userimpl0_.id as id1_, userimpl0_.creationDate as creation2_1_, userimpl0_.lastModified as lastModi3_1_, userimpl0_.city as city1_, userimpl0_.country as country1_, userimpl0_.latitude as latitude1_, userimpl0_.longitude as longitude1_, userimpl0_.postalCode as postalCode1_, userimpl0_.street as street1_, userimpl0_.birthDate as birthDate1_, userimpl0_.firstName as firstName1_, userimpl0_.secondName as secondName1_, userimpl0_.sex as sex1_, userimpl0_.surName as surName1_, userimpl0_.alias as alias1_, userimpl0_.enabled as enabled1_, userimpl0_.loginEmail as loginEmail1_, userimpl0_.password as password1_, userimpl0_.preferences_id as prefere19_1_ from TBL_USER userimpl0_ where userimpl0_.loginEmail=?
  11:27:51,878 TRACE org.hibernate.type.descriptor.sql.BasicBinder:81 - binding parameter [1] as [VARCHAR] - blady_the_best@o2.pl
  11:27:52,009  INFO hsqldb.db.HSQLDB39E3504C79.ENGINE:? - Database closed
  11:27:52,225 DEBUG org.hibernate.SQL:111 - select userimpl0_.id as id1_, userimpl0_.creationDate as creation2_1_, userimpl0_.lastModified as lastModi3_1_, userimpl0_.city as city1_, userimpl0_.country as country1_, userimpl0_.latitude as latitude1_, userimpl0_.longitude as longitude1_, userimpl0_.postalCode as postalCode1_, userimpl0_.street as street1_, userimpl0_.birthDate as birthDate1_, userimpl0_.firstName as firstName1_, userimpl0_.secondName as secondName1_, userimpl0_.sex as sex1_, userimpl0_.surName as surName1_, userimpl0_.alias as alias1_, userimpl0_.enabled as enabled1_, userimpl0_.loginEmail as loginEmail1_, userimpl0_.password as password1_, userimpl0_.preferences_id as prefere19_1_ from TBL_USER userimpl0_ where userimpl0_.alias=?
  11:27:52,230 TRACE org.hibernate.type.descriptor.sql.BasicBinder:81 - binding parameter [1] as [VARCHAR] - Bladositto
  11:27:52,346  INFO hsqldb.db.HSQLDB39E3504C79.ENGINE:? - Database closed
  11:27:52,470  INFO model.hibernate.UserServiceImpl:50 - User[id: null    loginEmail: blady_the_best@o2.pl    alias: Bladositto   password: asdasd]   class type:class model.hibernate.UserImpl$$EnhancerByCGLIB$$536b42dd
  11:27:52,481  INFO helpers.EntityAuditor:13 - User[id: null  loginEmail: blady_the_best@o2.pl    alias: Bladositto   password: asdasd]
  11:27:52,483  INFO helpers.EntityAuditor:13 - User[id: null  loginEmail: blady_the_best@o2.pl    alias: Bladositto   password: asdasd]
  11:27:52,581 DEBUG org.hibernate.SQL:111 - insert into TBL_USER (id, creationDate, lastModified, city, country, latitude, longitude, postalCode, street, birthDate, firstName, secondName, sex, surName, alias, enabled, loginEmail, password, preferences_id) values (default, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
  11:27:52,587 TRACE org.hibernate.type.descriptor.sql.BasicBinder:70 - binding parameter [1] as [TIMESTAMP] - &lt;null&gt;
  11:27:52,589 TRACE org.hibernate.type.descriptor.sql.BasicBinder:70 - binding parameter [2] as [TIMESTAMP] - &lt;null&gt;
  11:27:52,590 TRACE org.hibernate.type.descriptor.sql.BasicBinder:70 - binding parameter [3] as [VARCHAR] - &lt;null&gt;
  11:27:52,604 TRACE org.hibernate.type.descriptor.sql.BasicBinder:70 - binding parameter [4] as [VARCHAR] - &lt;null&gt;
  11:27:52,606 TRACE org.hibernate.type.descriptor.sql.BasicBinder:70 - binding parameter [5] as [DOUBLE] - &lt;null&gt;
  11:27:52,609 TRACE org.hibernate.type.descriptor.sql.BasicBinder:70 - binding parameter [6] as [DOUBLE] - &lt;null&gt;
  11:27:52,610 TRACE org.hibernate.type.descriptor.sql.BasicBinder:70 - binding parameter [7] as [VARCHAR] - &lt;null&gt;
  11:27:52,611 TRACE org.hibernate.type.descriptor.sql.BasicBinder:70 - binding parameter [8] as [VARCHAR] - &lt;null&gt;
  11:27:52,612 TRACE org.hibernate.type.descriptor.sql.BasicBinder:70 - binding parameter [9] as [DATE] - &lt;null&gt;
  11:27:52,614 TRACE org.hibernate.type.descriptor.sql.BasicBinder:70 - binding parameter [10] as [VARCHAR] - &lt;null&gt;
  11:27:52,615 TRACE org.hibernate.type.descriptor.sql.BasicBinder:70 - binding parameter [11] as [VARCHAR] - &lt;null&gt;
  11:27:52,616 DEBUG org.hibernate.type.EnumType:136 - Binding null to parameter: 12
  11:27:52,618 TRACE org.hibernate.type.descriptor.sql.BasicBinder:70 - binding parameter [13] as [VARCHAR] - &lt;null&gt;
  11:27:52,619 TRACE org.hibernate.type.descriptor.sql.BasicBinder:70 - binding parameter [14] as [VARCHAR] - &lt;null&gt;
  11:27:52,621 TRACE org.hibernate.type.descriptor.sql.BasicBinder:70 - binding parameter [15] as [BIT] - &lt;null&gt;
  11:27:52,621 TRACE org.hibernate.type.descriptor.sql.BasicBinder:70 - binding parameter [16] as [VARCHAR] - &lt;null&gt;
  11:27:52,623 TRACE org.hibernate.type.descriptor.sql.BasicBinder:70 - binding parameter [17] as [VARCHAR] - &lt;null&gt;
  11:27:52,625 TRACE org.hibernate.type.descriptor.sql.BasicBinder:70 - binding parameter [18] as [BIGINT] - &lt;null&gt;
  11:27:52,767  INFO hsqldb.db.HSQLDB39E3504C79.ENGINE:? - Database closed
  </code></pre>