我正在扔毛巾。我不明白,它有多难?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