Jo Desmet created OPENJPA-2546:
----------------------------------
Summary: 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
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:java}
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 <h:outputText value="#{g}"/>
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)