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을 던집니까?