2014-11-23 23 views
0

我正在扔毛巾。我不明白,它有多难?TomEE + OpenJPA使用ManyToMany不起作用

我有两个实体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

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> 

庄严后台bean对于那些有兴趣在表中:

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) 
); 

注意到的第一件事是,组显示为空,不为空,但空(通过调试等验证)。所以我明白,默认情况下,@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) 

为什么试图在HashSet检索属性id代理,而不是在Group

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

什么g打印出不只是Set<Group>中的一个元素,但实际上是集合本身,它与前面显示的异常相匹配......这更加指示API或集成中的错误?

所以基本上看起来好像有些东西坏了,虽然我怀疑它都涉及到同一个问题。

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

+0

您可以发表团体,用户和GROUP_USERS表。 – 2014-11-23 23:52:32

+0

尝试是否有助于将模式添加到@JoinTable批注。如果这不帮助检查tomee的日志,看看openjpa是否报告任何问题。 – Eelke 2014-11-24 06:35:11

+0

好吧,我找到了解决这个问题的方法,只是没有办法解释。一旦我将'Set '替换为'List ',一切都开始按预期工作。那只是基于预感。不过,我确实明确地记得,我应该能够使用'Set '作为我不希望有任何重复的指示。为了确认,我阅读了[JSR 338:JavaTM Persistence 2.1](https://jcp.org/en/jsr/detail?id=338)。 – YoYo 2014-11-24 08:48:55

回答