使用ManyToMany的TomEE + OpenJPA不起作用
我在扔毛巾。 我不明白,它有多难?
我有两个实体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 users;
然后对于User
我创建实体,如下所示:
@Entity @Table(name = "USERS", catalog = "", schema = "GROUPADMIN") public class User { ... @ManyToMany(mappedBy="users") private Set groups;
然后在我的支持bean中,实际上是@Named("registry")
,我将对检索到的user
的引用存储为具有相同名称的属性。
然后我在我的JSF中使用那个支持bean
Hello Properties List Group
对于那些对表格感兴趣的人:
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) );
首先注意到的是,组似乎是空的,不是空的,而是空的(通过调试等validation)。 所以我理解默认情况下@ManyToMany
会使用Lazy绑定,所以我将其更改为fetch = FetchType.EAGER
(并不是说这应该重要)。 这样做之后,事情真的很奇怪……
此时EL开始抱怨"#{g.id}"
上不存在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
属性,我试图使用输出它…结果真的很有趣…
打印出来的不仅仅是Set
一个元素,而且实际上是集合本身,它与之前显示的exception相匹配…这更能说明API或集成中的错误?
所以基本上看起来好像有几件事情被破坏了,虽然我怀疑这一切都与同一个问题有关。
请注意,我使用了基本的现成TomEE,最新版本,没有自定义(JPA也没有增强器)。
为什么它应该工作: JSR 338:JavaTM持久性2.1。
提交的错误: Jira问题OpenJPA-2546 (请投票解决此问题)。
解决方法: Set
List
替换为List
作为解决方法。