Java 托米+;使用ManyToMany的OpenJPA不起作用

Java 托米+;使用ManyToMany的OpenJPA不起作用,java,jsf,jakarta-ee,jpa,Java,Jsf,Jakarta Ee,Jpa,我认输了。我不明白,这有多困难 我有两个实体用户和组,具有多对多关系组管理关系。所以在组中我有: @Entity @Table(name = "GROUPS", catalog = "", schema = "GROUPADMIN") public class Group { ... @ManyToMany @JoinTable( name = "GROUP_USERS", joinColumns = {@JoinColumn(name = "GROUP_ID")}

我认输了。我不明白,这有多困难

我有两个实体
用户
,具有多对多关系<代码>组管理关系。所以在
组中
我有:

@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;
然后在我的支持bean中,实际上是一个名为(“注册表”)的
@中,我将对检索到的
用户的引用存储为同名属性

然后我在我的JSF中使用这个支持bean

你好 属性列表 组
对于那些对表格感兴趣的人:

创建表“GROUPADMIN”.GROUPS
(
ID VARCHAR(15)非空主键
);
创建表“GROUPADMIN”
(
ID VARCHAR(50)非空主键,
密码VARCHAR(50),
名字VARCHAR(50),
姓氏VARCHAR(50)
);
创建表“GROUPADMIN”。将用户分组
(
组ID VARCHAR(15)不为空,
用户ID VARCHAR(50)不为空,
主键(组ID、用户ID)
);
首先要注意的是,组看起来是空的,不是空的,而是空的(通过调试等进行验证)。所以我知道默认情况下,
@manytomy
会使用延迟绑定,所以我将其更改为
fetch=FetchType.EAGER
(这根本不重要)。这么做之后,事情变得很奇怪

此时,EL开始抱怨
“#{g.id}”
上不存在id属性:

由以下原因引起:
javax.el.PropertyNotFoundException-在org.apache.openjpa.util.java$util$HashSet$proxy类型上找不到属性“id”
位于javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:266)
为什么它试图在
哈希集
代理上而不是在
上检索属性
id

因此,我很好奇我从
中得到的
g
属性中到底得到了什么,我试图简单地使用
输出它。。。结果真的很有趣

打印出来的
g
不仅仅是
集合
中的一个元素,实际上是集合本身,它与前面显示的异常匹配。。。这更能说明API或集成中存在缺陷

所以基本上看起来有几件东西坏了,尽管我怀疑这一切都与同一个问题有关

请注意,我使用了一个基本的现成的TOME,最新版本,没有定制(JPA也没有增强器)。

为什么它应该工作:

提交错误:(请投票解决此问题)


解决方法:将
Set
替换为
List
,作为一种解决方法。

请发布组、用户和组用户表。如果有助于将架构添加到@JoinTable注释,请尝试。如果这对检查tomee的日志没有帮助,看看openjpa是否报告了任何问题。好的,我找到了一种解决方法,只是没有解释的方法。一旦我将
Set
替换为
List
后,一切都开始按预期工作。那只是一种预感。然而,我确实清楚地记得,我读过一篇文章,我应该能够使用
Set
作为我不希望看到任何重复的指示。为了确认,我阅读了。我将其作为错误提交:
@Entity 
@Table(name = "USERS", catalog = "", schema = "GROUPADMIN")
public class User {
  ...
  @ManyToMany(mappedBy="users")
  private Set<Group> groups;