Можно ли отобразить поле в сущности без определения какой-либо ассоциации? - PullRequest
7 голосов
/ 23 декабря 2010

У меня есть следующая схема в БД (упрощенно)

MainTable(
    ID primary key
    SOMEFIELD
    CODE_FK1 -- references OtherTable1 CODE (without declared foreign key)
    CODE_FK2 -- references OtherTable2 CODE (without declared foreign key)
    ... Other fields used
)

OtherTable1(
    CODE primary key
    LABEL
    ... other fields not used
)

OtherTable2(
    CODE primary key
    LABEL
    ... other fields not used
)

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

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

Я полагаю, это приведет к чему-то такому:

@Entity
public class MainEntity{
    @Id
    private Integer ID;

    @Column(name="SOMEFIELD")
    private String SomeField;

    @SomeAnnotation to Join CODE_FK_1 with OtherTable1.CODE
    @SomeAnnotation like @Column(name="LABEL", table="OtherTable1")
    private String Label1;

    @SomeAnnotation to Join CODE_FK_1 with OtherTable1.CODE
    @SomeAnnotation like @Column(name="LABEL", table="OtherTable1")
    private String Label1;

}

Заранее спасибо за вашу помощь!

Ответы [ 2 ]

12 голосов
/ 24 декабря 2010

Другой возможностью было бы использование аннотации @Formula для извлечения значения из другой таблицы. Это автоматически сгенерирует подвыбор при загрузке вашей сущности.

Думаю, вам понадобится что-то вроде этого:

    @Entity
public class MainEntity{
    @Id
    private Integer ID;

    @Column(name="SOMEFIELD")
    private String SomeField;

    @Formula("(SELECT ot1.LABEL FROM OtherTable1 ot1 WHERE ot1.CODE = CODE_FK_1)")
    private String Label1;

}

В [Hibernate docs] [1] содержится мало информации об этом, поэтому вам может потребоваться некоторое количество проб и ошибок, чтобы сделать это правильно (но вы должны уметь работать с hibernate.show_sql=true.

У этого подхода есть 2 возможных недостатка:

  1. Это специфичный для hibernate код
  2. Это обычный SQL, и, следовательно, может быть специфичным для базы данных

НТН

[1]: http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-hibspec-property документы гибернации

2 голосов
/ 23 декабря 2010

Вы можете использовать аннотацию @SecondaryTable. Смотрите этот пример:

https://github.com/hibernate/hibernate-orm/blob/823a5c1ede1869fd97471e3b8ebe7ec4ac8068e4/hibernate-core/src/test/java/org/hibernate/test/annotations/join/Dog.java#L20-L24

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