2012-09-19 33 views
0

我有一個關於使用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?

回答

0

沒關係這個。 Hibernate正在以它應該的方式做出反應。我使用了一個@Transactional服務方法來獲取類別,並將該類別用作另一個@Transactional服務方法的輸入。當你這樣做時,Hibernate會爲新的第二個服務方法調用創建一個新的會話(因爲它有自己的Transactional註釋),並且在新會話中找不到該類別。這就是它拋出一個TransientObject異常的原因。我現在只是使用Category的id作爲seciond服務方法調用的參數,並且這可以工作。