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

Reply via email to