小编典典

使用ManyToMany的TomEE + OpenJPA不起作用

java

我把毛巾扔了。我不明白,这有多困难?

我有两个实体UserGroup具有多对多的关系。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中皇家使用了那个支持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(甚至不重要)。这样做之后,事情真的变得奇怪了…

此时,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)

为什么要尝试idHashSet代理而非代理上检索属性Group

所以我很好奇我实际上从那个g属性中得到了什么<h:dataTable>,我试图简单地使用<h:outputText value="#{g}"/>… 输出它,结果真的很有趣…

什么g打印出来并不仅仅是一个元件的Set<Group>,但实际上是集合本身,它的前面显示异常匹配......这更表明了API或整合中的错误?

因此,基本上,看起来好像有几件事坏了,尽管我怀疑这都与一个问题相关。

请注意,我使用的是基本的现成TomEE,最新版本,没有自定义功能(也没有JPA的增强器)。


阅读 219

收藏
2020-12-03

共1个答案

小编典典

为何起作用:JSR 338:JavaTM Persistence 2.1。

提交的错误:Jira问题OpenJPA-2546(请投票解决此问题)。

解决方法:更换Set<T>List<T>作为一种解决方法。

2020-12-03