2016-03-25 67 views
1

我面臨的交易錯誤,例如:如何測試Hibernate Session是否打開?

org.hibernate.LazyInitializationException:無法初始化懶洋洋作用 的集合: app.Parent.children,可以 無法初始化代理 - 沒有會話

這裏在parent.getChildren().size()

但是我有一個@Transactional@Service方法:

  • 1交易上createFactory()創建一個工廠,並給了EntityManager
  • 1交易上create()創建實體
@Path("api/parents") 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_JSON) 
@Controller 
public class ParentResource { 

    @Autowired 
    private ParentService parentService; 

    @POST 
    public Parent create(Parent parent) { 
     ParentFactory parentFactory = parentService.createFactory(parent); 
     return parentService.create(parent); 
    } 

} 

@Service 
public class ParentService { 

    @PersistenceContext 
    private EntityManager em; 

    @Transactional 
    public ParentFactory createFactory(Parent parent) { 
     return new ParentFactory(parent, em); 
    } 

    @Transactional 
    public Parent create(ParentFactory parentFactory) { 
     return parentFactory.create(); 
    } 

} 

// No Transactional annotation 
public class ParentFactory { 

    private Parent parent; 
    private EntityManager em; 

    public ParentFactory(Parent parent, EntityManager em) { 
     this.parent = parent; 
     this.em = em; 
    } 

    public parent create() { 
     if(parent.getChildren().size() < 3) { // Exception here 
      em.persist(this.parent); 
     } 
    } 

} 

我希望能夠測試我的Hibernate Session是否存活,以便我可以檢測k什麼時候丟失,爲什麼。

謝謝! 。

+0

可能diuplicate: http://stackoverflow.com/questions/345705/hibernate-lazyinitializationexception-could-not-initialize-proxy –

+0

同時檢查會話是否存活不會幫助。你需要弄清楚爲什麼會出現異常。 –

+0

只要事務處理方法結束,會話就會關閉。你有2個事務處理方法,每個方法都打開一個新的會話/實體管理器。最初用於「Parent」的會話已經關閉,因此出現錯誤。將該邏輯推入單個事務服務方法(因爲它應該是imho),而不是在您的控制器中。 –

回答

-1

與session.getTransaction()嘗試isActive()

0

我認爲處理您的需求的最佳方法是使用JPA驗證@Size(分= 3)對孩子財產

+0

謝謝@ oliv37,但在這裏我的問題是關於如何知道我什麼時候關閉會話。 – Pleymor

相關問題