我正在扔毛巾。我不明白,它有多難?TomEE + OpenJPA使用ManyToMany不起作用
我有兩個實體User
和Group
,具有多對多的關係。 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的增強器)。
您可以發表團體,用戶和GROUP_USERS表。 – 2014-11-23 23:52:32
嘗試是否有助於將模式添加到@JoinTable批註。如果這不幫助檢查tomee的日誌,看看openjpa是否報告任何問題。 – Eelke 2014-11-24 06:35:11
好吧,我找到了解決這個問題的方法,只是沒有辦法解釋。一旦我將'Set'替換爲'List ',一切都開始按預期工作。那只是基於預感。不過,我確實明確地記得,我應該能夠使用'Set '作爲我不希望有任何重複的指示。爲了確認,我閱讀了[JSR 338:JavaTM Persistence 2.1](https://jcp.org/en/jsr/detail?id=338)。 –
YoYo
2014-11-24 08:48:55