Hibernate: @SecondaryTable не работает - PullRequest
3 голосов
/ 07 марта 2012

Я знаю, что @SecondaryTable выпуски публиковались много раз, поэтому, если есть такой (я еще не нашел), пожалуйста, дайте мне ссылку или совет.

В моей базе данных есть две таблицы (firstTable и secondTable), два класса POJO Hibernate (FirstTablePojo и SecondTablePojo).

+----------+             +-----------+
|firstTable|             |secondTable|
|----------+             |-----------+
|featureId |------------>|featureId  |(secondTable's primary key)
|foo       |             |featureName|
|bar       |             +-----------+
+----------+

Я хочу показать поля из обеих этих таблиц в jsp из объекта единого списка, я решил использовать @SecondaryTable.Эти две таблицы связаны полем featureId (который является первичным ключом для secondTable), я хочу, чтобы featureName из secondTable отображался вместе с полями из firstTable.FirstTablePojo предшествует эта аннотация:

@SecondaryTable(name="secondTable", 
    pkJoinColumns=@PrimaryKeyJoinColumn(name="featureId", 
                                        referencedColumnName = "featureId"))

Я добавил это свойство в FirstTablePojo (с геттерами и сеттерами):

 @ManyToOne
 @JoinColumn(name="featureId", table="secondTable")
 String featureName;

Когда с помощью <c:forEach items="${features}" var="feature">, я получаю каждый ${feature.foo} (foo - это свойство, которое было в FirstTablePojo, прежде чем я использовал @SecondaryTable) и ${feature.featureName}, я вижу каждый foo, но ни один из featureNames не появляется,Было бы замечательно, если бы кто-то мог сказать мне, что мне здесь не хватает и почему имена объектов из другой таблицы не отображаются в списке FirstTablePojo объектов.

Ответы [ 2 ]

7 голосов
/ 08 марта 2012

Цель аннотации @SecondaryTable состоит в том, чтобы сопоставить поля одного объекта с несколькими таблицами, точно так, как если бы эти таблицы были объединены в одну.

@ ManyToOne используется для сопоставления связи «многие-к-одному» между двумя сущностями. Но у вас есть только один. Это не имеет смысла в этом контексте. И @JoinColumn используется, чтобы указать, что поле сопоставлено со столбцом, который составляет ... столбец соединения, то есть внешний ключ к другой таблице. Так что это тоже не имеет смысла.

Просто используйте следующее отображение:

@Column(name="featureName", table="secondTable")
String featureName;

Это хорошо объяснено, например, в документации Hibernate .

0 голосов
/ 19 апреля 2019

Имеет смысл использовать @JoinColumn, если вы хотите поместить поле внешнего ключа, которое представляет идентификатор другого объекта, во вторичную таблицу. В этом случае правильный путь будет:

 @OneToOne
 @JoinColumn(name="another_entity_id", table="secondTable")
 AnotherEntity anotherEntity;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...