我把毛巾扔了。我不明白,这有多困难?
我有两个实体User和Group具有多对多的关系。Group管理关系。所以Group我有:
User
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以相同的名称存储对检索到的引用作为属性。
@Named("registry")
user
然后我在我的JSF中皇家使用了那个支持bean
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>
对于那些对表感兴趣的人:
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) );
注意到的第一件事是组似乎是空的,不是空的,而是空的(已通过调试等验证)。因此,我知道默认情况下a @ManyToMany将使用惰性绑定,因此我将其更改为fetch = FetchType.EAGER(甚至不重要)。这样做之后,事情真的变得奇怪了…
@ManyToMany
fetch = FetchType.EAGER
此时,EL开始抱怨id属性不存在于"#{g.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)
为什么要尝试id在HashSet代理而非代理上检索属性Group?
id
HashSet
所以我很好奇我实际上从那个g属性中得到了什么<h:dataTable>,我试图简单地使用<h:outputText value="#{g}"/>… 输出它,结果真的很有趣…
g
<h:dataTable>
<h:outputText value="#{g}"/>
什么g打印出来并不仅仅是一个元件的Set<Group>,但实际上是集合本身,它的前面显示异常匹配......这更表明了API或整合中的错误?
Set<Group>
因此,基本上,看起来好像有几件事坏了,尽管我怀疑这都与一个问题相关。
请注意,我使用的是基本的现成TomEE,最新版本,没有自定义功能(也没有JPA的增强器)。
为何起作用:JSR 338:JavaTM Persistence 2.1。
提交的错误:Jira问题OpenJPA-2546(请投票解决此问题)。
解决方法:更换Set<T>与List<T>作为一种解决方法。
Set<T>
List<T>