2011-04-10 63 views
12

看起來,如果您使用由hibernate代理的set支持的selectManyCheckbox,您將遇到可怕的LazyInitializationException問題。這與支持bean的狀態無關!selectManyCheckbox進程驗證中的LazyInitializationException

調試Mojarra 2.1後,我發現如果不包含屬性collectionType,它會嘗試在流程驗證階段克隆後備值類,在我的情況下它是PersistentSet。當然,爲此添加任何值都會導致LazyInitializationException。

我的問題是您是否認爲這在過程驗證階段是合理的行爲?

克隆集合類的更好的算法是查看接口並從java.util實例化已知的類。

回答

0

感謝您使用h:selectMany標記的collectionType屬性來防止LazyInitializationException。

但是,而不是在一個不適當的論壇上發火焰,而不是在JSF 2.0中學習什麼新東西,併發布這個問題的一個完整的例子,以及如何解決它?

基點:

  • 鑽嘴魚科2.1是JSF 2參考實現(見What is Mojarra
  • h:selectManyCheckbox VLD文檔介紹瞭如何使用collectionType屬性(新的JSF 2.0)
  • 此問題影響的驗證h:selectManyCheckbox,h:selectManyListBox和h:selectManyMenu標記

堆棧此錯誤的跟蹤:

Feb 04, 2013 1:20:50 PM com.sun.faces.lifecycle.ProcessValidationsPhase execute WARNING: failed to lazily initialize a collection, no session or session was closed org.hibernate.LazyInitializationException: failed to lazily initialize a collection, no session or session was closed at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:383) at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:375) at org.hibernate.collection.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:122) at org.hibernate.collection.PersistentBag.isEmpty(PersistentBag.java:255) at javax.faces.component.UIInput.isEmpty(UIInput.java:1257) at javax.faces.component.UIInput.validateValue(UIInput.java:1144) at javax.faces.component.UISelectMany.validateValue(UISelectMany.java:579)

例如添加collectionType修復此錯誤(我使用的是自定義的驗證):

<h:selectManyListbox value="${technologyService.entity.associatedLabs}" 
collectionType="java.util.ArrayList"> 
<f:validator validatorId="selectManyListboxValidator" /> 
<f:attribute name="maxItems" value="5" /> 
<f:selectItems value="${metadataService.activeLabSelectItems}" /> 
</h:selectManyListbox> 
7

那完全點!它與會話狀態沒有任何關係...... 我遇到了這個問題,我能夠通過在我的組件中添加以下內容(在我的情況下是selectManyMenu)來解決它:

<f:attribute name="collectionType" value="java.util.ArrayList" />;