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;