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

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

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 ответа

Решение

Другая возможность будет использовать @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/ hibernate docs

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

https://github.com/hibernate/hibernate-core/blob/master/hibernate-core/src/test/java/org/hibernate/test/annotations/join/Dog.java

Другие вопросы по тегам