[
https://issues.apache.org/jira/browse/OPENJPA-2546?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14591773#comment-14591773
]
Paulo Cristovão de Araújo Silva Filho commented on OPENJPA-2546:
----------------------------------------------------------------
[[email protected]], do your entity objects override equals/hashCode?
> OpenJPA using ManyToMany does not work with Set<xxx>
> ----------------------------------------------------
>
> Key: OPENJPA-2546
> URL: https://issues.apache.org/jira/browse/OPENJPA-2546
> Project: OpenJPA
> Issue Type: Bug
> Components: instrumentation, jpa
> Affects Versions: 2.4.0
> Environment: Running as part of TomEE 1.7.1
> Reporter: Jo Desmet
> Labels: @ManyToMany, bidirectional
>
> Copying my own posting from StackOverflow.com
> I have two Entities User and Group, having a many to many relationship. Group
> manages the relationship. So in Group I have:
> {code:java}
> @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;
> {code}
> Then for User I create the entity something as follows:
> {code:java}
> @Entity
> @Table(name = "USERS", catalog = "", schema = "GROUPADMIN")
> public class User {
> ...
> @ManyToMany(mappedBy="users")
> private Set<Group> groups;
> {code}
> Then in my backing bean, actually a @Named("registry"), I store a reference
> to a retrieved user as a property with the same name.
> Then I use that backing bean royally in my JSF
> {code:html}
> 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>
> {code}
> For those interested in the tables:
> {code:sql}
> 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)
> );
> {code}
> Depending on how (lazy vs Eager) and when I run it, the result would be
> always wrong, but sometimes different:
> - sometimes complaining that property 'id' does not exist, like example below,
> - sometimes the returned set was Empty (not null, but zero size).
> {code}
> 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)
> {code}
> So me being curious what I actually got into that g attribute I got from the
> <h:dataTable>, I tried to output it simply using {code}<h:outputText
> value="#{g}"/>{code}
> What g printed out was not just one element out of the Set<Group>, but was
> actually the collection itself, which matches the earlier shown exception ...
> One important clue is that the problem is resolved once I replace the
> datatype from Set<Xxx> to List<Xxx>. With that change, everything started
> working as expected.
> However Logically wise I do need it as a Set, and the JSR documentation seems
> to support that.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)