Я бросаю в полотенце. Я не понимаю, как это сложно?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).
Не могли бы вы разместить таблицы групп, пользователей и GROUP_USERS. –
Попробуйте, если это поможет добавить схему в аннотацию @JoinTable. Если это не поможет проверить журнал tomee, чтобы узнать, раскрывает ли openjpa какие-либо проблемы. – Eelke
Хорошо, я нашел способ исправить это, просто не объясню.Как только я заменил 'Set' на 'List ' все начинает работать, как ожидалось. Это было основано на догадках. Тем не менее, я явно помню, как читаю, что я должен использовать 'Set ' как указание на то, что я не ожидал бы дубликатов. Чтобы подтвердить это, я прочитал [JSR 338: JavaTM Persistence 2.1] (https://jcp.org/en/jsr/detail?id=338). –
YoYo