2010-07-11 60 views
2

我在稱爲事件和藝術家的兩個實體之間存在多對多關係,兩者都註釋爲延遲加載。當我打開一個藝術家,我初始化它的事件,因爲會議將隨後使用無法從JSF2訪問延遲註釋但已初始化的hibernate集合

Hibernate.initialize(artist.getEvents()); 

純Java編寫的測試工作正常,我以後可以訪問該事件和它的屬性被關閉。

但是在呈現結果的.xhtml頁面中,我只能訪問藝術家的屬性並測試是否有可用的事件,Artist是輔助bean,getData()返回Artist,下面的行仍然有效:

<h:outputText value="No events available" rendered="#{empty artist.data.events}"/> 

但是,當我想用​​

<h:dataTable value="#{artist.data.events}" var="event" rendered="#{not empty artist.data.events}"> 
    <h:column> 
    <h:outputText value="#{event.title}"/> 
    </h:column> 
</h:dataTable> 

我得到的followig例外訪問一個DataTable的事件的性質:

/artist.xhtml @48,63 value="#{event.title}": The class 'org.hibernate.collection.PersistentSet' does not have the property 'title'. 

我的第一個想法是,Hibernate的初始化方法不能與JSF2一起工作,但是當我將FetchType從LAZY更改爲EAGER時,我最終得到了相同的結果。

Event類看起來像這樣,爲了簡便起見,我只包括了相關的title屬性的部分:

@Entity() 
@Table(name="Events") 
@SequenceGenerator(name="events_id", sequenceName="event_seq", initialValue=1, allocationSize=1) 
public class EventData implements Serializable { 

    private String title; 
    // other private variables 

    public EventData() {} 

    public EventData(String title, ...) { 
     this.title = title; 
     // ... 
    } 

    public String getTitle() { 
     return title; 
    } 

    public void setTitle(String title) { 
     this.title = title; 
    } 

    // other setters/getters, equals/getHashCode overrides  

} 
+0

你可以發佈類「事件」的代碼? – pakore 2010-07-11 11:13:52

回答

6

UIData組件只能遍歷一個T[]List<E>DataModel<E>,不超過Set<E>因爲有沒有辦法指數,以確定在Set<E>的元素,而它在UIData組件所需。

@Bozho已經寫了一個weblog描述瞭如何繞過它的一種方法。其他方法是將JPA配置爲使用List<E>,或者添加一個將其包裝在List<E>DataModel<E>中的吸氣劑,並將其用於UIData組件中。例如。

public DataModel<Event> getEventModel() { 
    return new ArrayDataModel<Event>(events.toArray(new Event[events.size()])); 
} 

這的方式使用相同情況下(不復制/克隆/重新創建它們),因此所有的改變將在合適的情況下被反射。


更新:在即將到來的JSF 2.2中,將UIData最後supportCollection<E>,其因此包括Set<E>。另一種方法是創建一個自定義的EL解析器,這裏回答如下:How do I use a java.util.Set with UIData in JSF. Specifically h:datatable?

+0

感謝您的確切答案BalusC,我添加了一個屬性事件(列表 getEvents())到我的藝術家支持Bean它的工作! – hro 2010-07-11 17:33:19

0

巫毒需要任何bean暴露到#{...}設施。最簡單的方法是在您的Web容器支持它的情況下使用CDI,但另外查看JSF2中的@ManagedBean註釋。

+0

我有其他的xhtml頁面訪問藝術家的屬性就好了@ManagedBean – hro 2010-07-11 17:18:50