我有一個關於使用JPA/Hibernate設置的Spring MVC 3的兩部分問題。當按'實體'搜索時TransientObjectException
首先,無論我在我的服務方法中是否放置@Transactional註釋,它總是有效,我覺得這很奇怪。當我忘記添加@Transactional註釋時,我習慣了抱怨他們沒有事務的方法。
這是我在application-context.xml文件中設置的事務。其次,當我使用服務方法來獲取Category時,我得到一個Category對象。據我可以告訴它不是一個代理,而是一個真正的對象,大多數屬性設置。當我使用類別來搜索課程出了問題:
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?