当前位置: 首页 > 面试题库 >

使用ManyToMany的TomEE + OpenJPA不起作用

鲜于仰岳
2023-03-14
问题内容

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

我有两个实体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的增强器)。


问题答案:

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

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

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



 类似资料:
  • 我在java应用程序中遇到以下异常。 我对entity表中的其他3个字段有一个唯一的约束,对attributes表中的name、Value有一个唯一的约束。当我尝试persist an实体(它有一组属性)时,repository.save()方法会失败,原因有两个:1。属性表中可能已经存在一个属性,由于唯一约束(这是我想要的。但我仍然想创建与实体的这些属性的关联)而无法插入2。实体可能已经存在,但

  • 我在这里找到了一些关于这个主题的线索,但没有一个建议对我有效。 经过几天疯狂的谷歌搜索和测试,我被难倒了。如有任何帮助,不胜感激,谢谢。

  • 我用tomee创建了一个项目,我想使用stomp协议在我的web应用程序和使用ActiveMQ作为MOM的客户端之间交换消息,但当我运行tomee时,会出现以下异常: 线程“ActiveMQ传输服务器线程处理程序中出现异常:stomp://0.0.0.0:61222“java.lang.NoClassDefFoundError:com/thoughtworks/xstream/io/Hierarc

  • 我有两个多对多关系的实体。 在类角色中: java.lang.StackOverflowError:空 我该如何解决这个问题?我在Stackoverflow上看到了类似的问题,但我没有找到真正有效的解决方案。 Upd:抛出异常的位置:

  • 在嵌入式TomEE容器中运行Arquillian测试时,我得到了以下错误

  • 因此,我在一个控制器中有一个非常简单的代码片段,在这个代码片段中,我使用从外部文件中获取数据,它工作得很好!但是当我使用时,我会在控制台中得到一个