2012-04-03 84 views
2

的創建一個新的實體,存儲它的第一次,然後希望訪問相關的類的集合:休眠:無會話後保存新的實體

@Override 
protected void onSubmit(final AjaxRequestTarget target, final Form<?> form) {   
     final E entity = (E) form.getModelObject(); 
     getDao().save(entity); //calls session.saveOrUpdate(entity) 
     LOG.debug("Saved entity " + entity); 
     LOG.debug("Show collections " + entity.getField().getListOfSomething()); 
     parent.replaceContentPanel(parent.getDetailsPanel(parent.createReloadableModel(entity)), target); 
} 

我上第二以下錯誤日誌的路線:

org.hibernate.LazyInitializationException: 
failed to lazily initialize a collection of role: 
no session or session was closed 

我也曾嘗試

Hibernate.initialize(getDetailsModel().getObject().getField().getListOfSomething()); 

這導致了不同的錯誤:

org.hibernate.HibernateException: collection is not associated with any session 

這並不是很令人驚訝,當調試我可以看到集合代理沒有與他們關聯的會話。

我正在使用Spring框架附帶的'openSessionInView'過濾器。當我想要更新現有的實體時,代碼可以正常工作。當我將fetchType設置爲渴望集合時,它也可以工作:

@OneToMany(mappedBy = "field", fetch = FetchType.EAGER) 
private List<E> listOfSomething= new ArrayList<E>(); 

我真的需要將它設置爲EAGER嗎?我非常想避免這種情況,希望能有辦法解決這個問題。有沒有辦法將新存儲的實體與Hibernate會話關聯起來?我已經嘗試了session.load(entity)session.merge(entity)都沒有成功。

我的實體是這樣的:

@Entity class A { 
    @ManyToOne B b; 
} 

@Entity class B {  
    @OneToMany(mappedBy = "b") List<A> aList; 
    @OneToMany(mappedBy = "b") List<C> cList; 
} 

@Entity class C { 
    @ManyToOne B b; 
} 

什麼我做的是創造一個c = new C(),從DropDownChoice選擇b並提交我要堅持getDao().save(c)。提交之後,我想在通過ajax加載的不同面板上顯示我的新實體。例如,我想顯示c.getB().getAList(),這是發生異常的原因,因爲從DropdownChoice中選擇的b是分離的實體,並且它的aList未被提取,也無法延遲加載。

我無法弄清楚如何將仍然存在的會話放入我的新C實例中。

下面是從我web.xml

<filter> 
    <filter-name>opensessioninview</filter-name> 
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>   
</filter> 
<filter-mapping> 
    <filter-name>opensessioninview</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
+0

您正在使用的'openSessionInView'過濾器,事務何時/何地啓動並提交? – rotsch 2012-04-03 07:26:19

+0

你的實體是怎樣的?例如。保存操作是否會級聯到集合? – bert 2012-04-03 08:32:55

+0

請包含web.xml的相關部分(調度程序servlet和OpenSessionInView過濾器) – pap 2012-04-03 14:00:55

回答

-1

我發現了一個變通,讓我強制加載我知道我會需要Hibernate.initialize(...)

final ListModel<B> listModel = new ListModel<B>(bList); 
for (final B b : bList) { 
    Hibernate.initialize(b.getAList()); 
} 
add(new DropDownChoice<B>("b", listModel, new ChoiceRenderer<B>("name", "id"))); 

當我從這個片段添加2-4行到我的形式B所有實例的集合是我可能以後選擇我的新實例C將有一個初始化列表A

我只對此感到高興。我仍然希望能夠根據需要將對象附加到休眠會話。

0

更多信息適當的解決方法是合併(),它包含訪問該集合前集合的對象。

+0

我嘗試合併原始實體,我嘗試合併相關的包含集合的那個實體。既沒有作用 - .- – Yashima 2012-04-03 12:39:18