2014-11-23 47 views
0

我正在扔毛巾。我不明白,它有多難?TomEE + OpenJPA使用ManyToMany不起作用

我有兩個實體UserGroup,具有多對多的關係。 Group管理關係。因此,在Group我:

@Entity 
@Table(name = "GROUPS", catalog = "", schema = "GROUPADMIN") 
public class Group { 
    ... 
    @ManyToMany 
    @JoinTable(
    name = "GROUP_USERS", 
    joinColumns = {@JoinColumn(name = "GROUP_ID")}, 
    inverseJoinColumns = {@JoinColumn(name = "USER_ID")} 
) 
    private Set<User> users; 

那麼對於User我創建實體的東西如下:

@Entity 
@Table(name = "USERS", catalog = "", schema = "GROUPADMIN") 
public class User { 
    ... 
    @ManyToMany(mappedBy="users") 
    private Set<Group> groups; 
我支持bean中

那麼,究竟一個@Named("registry"),我引用存儲到檢索user作爲一個同名的財產。

然後我用我的JSF

Hello <h:outputLabel value="#{registry.user.firstName}"/> 
<h:panelGroup> 
    <h:dataTable value="#{registry.user.groups}" var="g"> 
    <f:facet name="header">Properties List</f:facet> 
    <h:column> 
     <f:facet name="header">Group</f:facet> 
     <h:outputText value="#{g.id}"/> 
    </h:column> 
    </h:dataTable> 
</h:panelGroup> 

莊嚴後臺bean對於那些有興趣在表中:

create table "GROUPADMIN".GROUPS 
(
    ID VARCHAR(15) not null primary key 
); 
create table "GROUPADMIN".USERS 
(
    ID VARCHAR(50) not null primary key, 
    PASSWORD VARCHAR(50), 
    FIRST_NAME VARCHAR(50), 
    LAST_NAME VARCHAR(50) 
); 
create table "GROUPADMIN".GROUP_USERS 
(
    GROUP_ID VARCHAR(15) not null, 
    USER_ID VARCHAR(50) not null, 
    primary key (GROUP_ID, USER_ID) 
); 

注意到的第一件事是,組顯示爲空,不爲空,但空(通過調試等驗證)。所以我明白,默認情況下,@ManyToMany將使用惰性綁定,所以我將其更改爲fetch = FetchType.EAGER(並非這應該是重要的)。這樣做之後,事情真的得到怪異......

此時EL就開始抱怨id屬性沒有對"#{g.id}"存在:

Caused by: 
javax.el.PropertyNotFoundException - Property 'id' not found on type org.apache.openjpa.util.java$util$HashSet$proxy 
at javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:266) 

爲什麼試圖在HashSet檢索屬性id代理,而不是在Group

所以我好奇什麼事實上,我到該g屬性我從<h:dataTable>了,我試圖輸出它簡單地使用<h:outputText value="#{g}"/> ......結果很有趣......

什麼g打印出不只是Set<Group>中的一個元素,但實際上是集合本身,它與前面顯示的異常相匹配......這更加指示API或集成中的錯誤?

所以基本上看起來好像有些東西壞了,雖然我懷疑它都涉及到同一個問題。

請注意,我使用了基本的現成TomEE,最新版本,沒有定製(也沒有針對JPA的增強器)。

+0

您可以發表團體,用戶和GROUP_USERS表。 – 2014-11-23 23:52:32

+0

嘗試是否有助於將模式添加到@JoinTable批註。如果這不幫助檢查tomee的日誌,看看openjpa是否報告任何問題。 – Eelke 2014-11-24 06:35:11

+0

好吧,我找到了解決這個問題的方法,只是沒有辦法解釋。一旦我將'Set '替換爲'List ',一切都開始按預期工作。那只是基於預感。不過,我確實明確地記得,我應該能夠使用'Set '作爲我不希望有任何重複的指示。爲了確認,我閱讀了[JSR 338:JavaTM Persistence 2.1](https://jcp.org/en/jsr/detail?id=338)。 – YoYo 2014-11-24 08:48:55

回答