2012-09-02 3 views
1

거의 모든 곳에서 검색했지만 아무도이 문제가없는 것 같습니다. 스프링 MVC 애플리케이션이 있습니다. 컨텍스트 구성 파일에 요청 범위 Bean으로 선언되고 UsersController에서 참조하는 UserImpl 엔터티가 있습니다. UsersController가 참조하는 UserImpl 객체는 실제로 CGLib 프록시입니다 (here은 왜?). 일부 검색 내가 뭔가를 발견 한 후HibernateTemplate을 사용하여 CGLIB 프록시 엔티티 지속

org.hibernate.MappingException: Unknown entity: main.mvc.model.hibernate.UserImpl$$EnhancerByCGLIB$$9ac49631

: 내가 처음 HibernateTemplate에와 같은 프록시 개체를 유지하려고 할 때 지금은이 오류가 발생했습니다

좀 문제를 해결

org.springframework.orm.hibernate3.support.ScopedBeanInterceptor

. 이제는 MappingException을 얻지 않고 엔티티는 지속되지만 데이터베이스 레코드의 모든 필드는 null입니다. 뭐가 문제 야?

참고 : UserImpl 인스턴스를 하드 코딩하고 UserServiceImpl로 유지하면 모든 것이 정상입니다. 환경 설정의

부 :

<bean id="userService" class="main.mvc.model.hibernate.UserServiceImpl"/> 
<bean id="userValidator" class="main.validators.UserValidator"/> 
<bean id="userWrapperValidator" class="main.validators.UserWrapperValidator"/> 
<bean id="user" class="main.mvc.model.hibernate.UserImpl" scope="request"> 
    <aop:scoped-proxy/> 
</bean> 
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="packagesToScan" value="main.mvc.model.hibernate"/> 
    <property name="entityInterceptor"> 
<bean class="org.springframework.orm.hibernate3.support.ScopedBeanInterceptor"/> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hibernate.hbm2ddl.auto">update</prop> 
     </props> 
    </property> 
</bean> 

UsersController :

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"; 
    } 
... 
} 

UserServiceImpl :

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<Role> roles = new LinkedList<>(); 
     roles.add(Role.ROLE_USER); 
     user.setRoles(roles); 

     Logger.getLogger(getClass()).info(user); 
     getHibernateTemplate().save(user); 
    } 
... 
} 

업데이트
이 좋아, 그래서 나는 몇 가지 AOP의 마법 출력을 추가 추가했습니다 무슨 우연 ScoppedBeanInterceptor에서 처리되는 동안 엔터티 개체에 펜. 그것은 손상되지 않았습니다. Hibernate의 BasicBinder가 null 값을 SQL 문에 바인딩하고있다. 어떤 도움이 필요합니까?

로그 :. 기본 Hibernate는 당신이 전달 객체의 클래스에 보이는하여 Hibernate는이 봄이 강화 된 클래스에 대한 아무 생각이 없기 때문에

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] - [email protected] 
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: [email protected] alias: Bladositto password: asdasd] class type:class model.hibernate.UserImpl$$EnhancerByCGLIB$$536b42dd 
11:27:52,481 INFO helpers.EntityAuditor:13 - User[id: null loginEmail: [email protected] alias: Bladositto password: asdasd] 
11:27:52,483 INFO helpers.EntityAuditor:13 - User[id: null loginEmail: [email protected] 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] - <null> 
11:27:52,589 TRACE org.hibernate.type.descriptor.sql.BasicBinder:70 - binding parameter [2] as [TIMESTAMP] - <null> 
11:27:52,590 TRACE org.hibernate.type.descriptor.sql.BasicBinder:70 - binding parameter [3] as [VARCHAR] - <null> 
11:27:52,604 TRACE org.hibernate.type.descriptor.sql.BasicBinder:70 - binding parameter [4] as [VARCHAR] - <null> 
11:27:52,606 TRACE org.hibernate.type.descriptor.sql.BasicBinder:70 - binding parameter [5] as [DOUBLE] - <null> 
11:27:52,609 TRACE org.hibernate.type.descriptor.sql.BasicBinder:70 - binding parameter [6] as [DOUBLE] - <null> 
11:27:52,610 TRACE org.hibernate.type.descriptor.sql.BasicBinder:70 - binding parameter [7] as [VARCHAR] - <null> 
11:27:52,611 TRACE org.hibernate.type.descriptor.sql.BasicBinder:70 - binding parameter [8] as [VARCHAR] - <null> 
11:27:52,612 TRACE org.hibernate.type.descriptor.sql.BasicBinder:70 - binding parameter [9] as [DATE] - <null> 
11:27:52,614 TRACE org.hibernate.type.descriptor.sql.BasicBinder:70 - binding parameter [10] as [VARCHAR] - <null> 
11:27:52,615 TRACE org.hibernate.type.descriptor.sql.BasicBinder:70 - binding parameter [11] as [VARCHAR] - <null> 
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] - <null> 
11:27:52,619 TRACE org.hibernate.type.descriptor.sql.BasicBinder:70 - binding parameter [14] as [VARCHAR] - <null> 
11:27:52,621 TRACE org.hibernate.type.descriptor.sql.BasicBinder:70 - binding parameter [15] as [BIT] - <null> 
11:27:52,621 TRACE org.hibernate.type.descriptor.sql.BasicBinder:70 - binding parameter [16] as [VARCHAR] - <null> 
11:27:52,623 TRACE org.hibernate.type.descriptor.sql.BasicBinder:70 - binding parameter [17] as [VARCHAR] - <null> 
11:27:52,625 TRACE org.hibernate.type.descriptor.sql.BasicBinder:70 - binding parameter [18] as [BIGINT] - <null> 
11:27:52,767 INFO hsqldb.db.HSQLDB39E3504C79.ENGINE:? - Database closed 

답변

1

'알 수없는 실체 "비트입니다. Hibernate 용어로 사용자 정의 엔티티 이름 해석을 허용하는 계약 인 org.hibernate.EntityNameResolver을 등록해야합니다. 정말 봄에 등록해야하지만, 사소한 세부 사항입니다.)

또는 save() 등의 형식을 호출 할 수 있습니다. al. 엔티티 이름을 승인하는 예를 들어,보다는 :

getHibernateTemplate().save(user); 

사용이 대신 :

getHibernateTemplate().save(User.class.getName(), user); 

(Spring의 HibernateTemplate에 가정은 실제로 실제로 템플릿 클래스 내 경험을 제공 꽤 큰 가정이다 그 방법을 노출).

+0

예.하지만이 문제는 이미 (ScopedBeanInterceptor에 의해) 해결되었습니다. 주요 문제에 대한 아이디어가 있습니까? – Bladositto

+0

잘 모르겠다. Spring의 향상된 엔티티에 더 많은 문제가 있다고 생각합니다. 나는 Spring이 아니라 Hibernate를 안다. –