JPA Два ElementCollections одного типа в одном классе - PullRequest
1 голос
/ 23 марта 2011

Я использую спецификацию JPA2 с Hibernate в качестве провайдера персистентности.Может кто-нибудь подсказать мне, как отобразить две коллекции элементов одного типа в одном классе?Например,

</p> <pre><code> public class Employee { @Id //... private Long id; @ElementCollection private Collection<String> tempAddresses; @ElementCollection private Collection<String> permanentAddresses; }

При отображениях по умолчанию во время режима гибернации нагрузки невозможно различить два списка, поскольку они сопоставлены с одним и тем же соединениемстолбец (т. е. столбец идентификатора).

Редактировать 1 Я забыл упомянуть, что мое требование состоит в том, чтобы сопоставить оба набора элементов в одну и ту же таблицу, поскольку оба являются адресами.Таким образом, сопоставления должны выглядеть следующим образом:

public class Employee { @Id //... private Long id;</p> <pre><code> @ElementCollection @CollectionTable(name = "ADDRESS", joinColumn = @JoinColumn(name = "EMP_ID")) @Column(name = "ADDRESS_ID") private Collection<String> tempAddresses; @ElementCollection @CollectionTable(name = "ADDRESS", joinColumn = @JoinColumn(name = "EMP_ID")) @Column(name = "ADDRESS_ID") private Collection<String> permanentAddresses; }

Поскольку обе коллекции сопоставлены с одной и той же таблицей сбора и объединены с одним и тем же столбцом идентификатораследовательно, во время загрузки hibernate не может различить, какие адреса являются временными, а какие постоянными.

1 Ответ

2 голосов
/ 23 марта 2011

При отображениях по умолчанию во время загрузки hibernate не может различить два списка, поскольку они сопоставлены с одним и тем же столбцом соединения (т. Е. Столбцом id).

Ну нет! При отображениях по умолчанию hibernate будет различать два списка, сохраняя их в разных таблицах.

Мое требование - сопоставить оба набора элементов с одной и той же таблицей, поскольку оба являются адресами.

Они оба адреса. Но они имеют различное использование, которое вы явно хотите выделить. Если вы используете аннотацию @ElementCollection для их сопоставления, разумный способ различить их - поместить их в разные таблицы.

Другим (более традиционным) подходом будет создание адресной сущности вместо представления их в виде простых строк и использование аннотаций @OneToMany для соединения их с вашим классом Employee. Тогда все адреса действительно могут быть в одной и той же таблице, но hibernate создаст таблицы соединений, соединяющие их с таблицей Employee. Было бы еще две таблицы соединения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...