2012-09-19 3 views
0

JPA/Hibernate 설정을 사용하는 Spring MVC 3에 관한 두 부분으로 된 질문이 있습니다.'엔티티 별'검색시 TransientObjectException

먼저 서비스 메서드에 @Transactional 주석을 넣었는지 여부는 중요하지 않습니다. 항상 작동하며 오히려 이상하게 느껴집니다. @Transactional 어노테이션을 추가하는 것을 잊었을 때 트랜잭션이 없다는 불평하는 메소드에 익숙하다.

이것은 application-context.xml 파일의 트랜잭션 설정입니다.

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" p:dataSource-ref="dataSource"/> 
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" p:entityManagerFactory-ref="entityManagerFactory"/> 
<tx:annotation-driven transaction-manager="transactionManager"/> 

둘째, 서비스 메소드를 사용하여 카테고리를 가져 오는 경우 카테고리 오브젝트가 생성됩니다. 내가 말할 수있는 한, 대부분의 속성이 설정된 상태에서 프록시가 아니라 실제 개체라고 말할 수 있습니다. 나는이 과정을 검색하는 카테고리를 사용하는 경우는 잘못 :

public List<Course> findCourses(Category category) { 
    Query queryGood = entityManager.createQuery("select c from Course c join fetch c.company where c.category.id = :categoryId"); 
    Query queryBad = entityManager.createQuery("from Course c where c.category = :category"); 

    queryGood.setParameter("categoryId", category.getId()); 
    queryBad.setParameter("category", category); 

    List<Category> categoriesGood = queryGood.getResultList(); // THIS WORKS! 
    List<Category> categoriesBad = queryBad.getResultList(); // THIS THROWS AN EXCEPTION 
    return null; 

} 
다음과 같은 예외에 queryBad 결과이 실행

:

org.springframework.dao.InvalidDataAccessApiUsageException: 
org.hibernate.TransientObjectException: object references an unsaved 
transient instance - save the transient instance before flushing: 
nl.myapp.domain.Category; nested exception is java.lang.IllegalStateException: 
org.hibernate.TransientObjectException: object references an unsaved transient instance 
- save the transient instance before flushing: nl.myapp.domain.Category 
org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:298) 

당신은 알고 계십니까 이유는 (1) 내 응용 프로그램을 사용하지 않고 데이터를 가져옵니다 @Transactional 어노테이션과 2) 왜 Hibernate가이 TransientObjectException을 던집니까?

답변

0

이 문제에 대해 신경 쓰지 마세요. 최대 절전 모드는 꼭 필요한 방식으로 반응하고있었습니다. 하나의 @Transactional 서비스 메소드를 사용하여 카테고리를 얻었고 그 카테고리를 다른 @Transactional 서비스 메소드의 입력으로 사용했습니다. 그렇게 할 때, Hibernate는 (자신의 Transactional 어노테이션을 가지고 있기 때문에) 새로운 두 번째 서비스 메소드 호출을위한 새로운 세션을 생성하고 새로운 세션에서 카테고리를 찾을 수 없다. 그래서 TransientObject 예외가 발생합니다. 이제는 카테고리의 ID를 seciond 서비스 메소드 호출에 대한 매개 변수로 사용하고 있습니다.