2014-11-23 1 views
0

Я бросаю в полотенце. Я не понимаю, как это сложно?TomEE + OpenJPA с использованием ManyToMany не работает

У меня есть две организации User и Group, имея отношение много к большому. 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; 

Тогда в моем бэк-боб, на самом деле @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> 

Для тех, кто заинтересован в таблицах:

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 будет использовать Lazy binding, поэтому я изменил это на fetch = FetchType.EAGER (не то, что это должно даже иметь значение). После этого, вещи действительно получил странный ...

На данный момент EL начал жаловаться, что свойство идентификатора не существует на "#{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) 

Почему она пытается получить свойство id на HashSet прокси, а не на Group?

Так мне быть интересно, что я на самом деле попал в этот g атрибут я получил от <h:dataTable>, я пытался вывести его просто с помощью <h:outputText value="#{g}"/> ... результат был действительно интересен ...

Что g распечатан не был только один элемент из Set<Group>, но на самом деле был самой коллекцией, которая соответствует ранее показанному исключению ... это более показательно для ошибки в API или интеграции?

Так что, похоже, что некоторые вещи сломаны, хотя я подозреваю, что все это относится к одной и той же проблеме.

Обратите внимание, что я использовал базовый готовый TomEE, самую последнюю версию, без настройки (без усилителя для JPA).

+0

Не могли бы вы разместить таблицы групп, пользователей и GROUP_USERS. –

+0

Попробуйте, если это поможет добавить схему в аннотацию @JoinTable. Если это не поможет проверить журнал tomee, чтобы узнать, раскрывает ли openjpa какие-либо проблемы. – Eelke

+0

Хорошо, я нашел способ исправить это, просто не объясню.Как только я заменил 'Set ' на 'List ' все начинает работать, как ожидалось. Это было основано на догадках. Тем не менее, я явно помню, как читаю, что я должен использовать 'Set ' как указание на то, что я не ожидал бы дубликатов. Чтобы подтвердить это, я прочитал [JSR 338: JavaTM Persistence 2.1] (https://jcp.org/en/jsr/detail?id=338). – YoYo

ответ

0

Почему он должен работать: JSR 338: JavaTM Persistence 2.1.

Bug представил: Jira Issue OpenJPA-2546 (пожалуйста, голосовать по получению этого решено).

Обход проблемы: заменить Set<T> на List<T> в качестве обходного пути.

Смежные вопросы