Hibernate Common Primary Key часть All Entity

У меня есть следующая структура базы данных, где в каждой таблице присутствует определенный столбец, и эти столбцы (CPK1, CPK2, CPK3, CPK4) являются частью первичного ключа всех таблиц. Также каждая таблица имеет один дополнительный первичный ключ, который является фактическим первичным ключом и упоминается в другой таблице как внешний ключ (IDPKA в TableB, IDPKB в TableC). Я не могу создать структуру сущностей для этих таблиц.

TableA
-------------------------------------------------------------
CPK1    CPK2    CPK3    CPK4    IDPKA   A1
-------------------------------------------------------------
10      1       2       3       1       XYZ 
-------------------------------------------------------------

TableB
-------------------------------------------------------------
CPK1    CPK2    CPK3    CPK4    IDPKB   B1  IDPKA
-------------------------------------------------------------
10      1       2       3       1       BDATA1  1
10      1       2       3       2       BDATA2
-------------------------------------------------------------

TableC
-------------------------------------------------------------
CPK1    CPK2    CPK3    CPK4    IDPKC   C1  IDPKB
-------------------------------------------------------------
10      1       2       3       1       ABCD    1
10      1       2       3       2       PQRS    1
10      1       2       3       3       ABCD1   2
10      1       2       3       4       PQRS1   2
-------------------------------------------------------------

в соответствии с данными, приведенными ниже, являются отношения корабля.

XYZ
|
|---BDATA1
|   |
|   |---ABCD    
|   |---PQRS    
|
|---BDATA2
|   |
|   |---ABCD1   
|   |---PQRS1   

Структура сущности должна быть такой, чтобы я мог запрашивать таблицу A с помощью CPK1, CPK2, CPK3, CPK4, IDPKA, и все данные должны быть получены с правильным отношением.

Еще одна вещь, которую я использую в аннотации к объекту POJO.

Если можно, помогите, если нельзя, подскажите, пожалуйста.


person Partha Sarathi Ghosh    schedule 04.12.2015    source источник


Ответы (1)


Поскольку вы сопоставляете таблицы друг с другом только с помощью IDPKA, IDPKB и IDPKC забывают о других столбцах. Они выглядят как обычные столбцы для этих таблиц. Если вы хотите улучшить поиск, вы сделаете составные имдексы с ними позже, но сейчас это не наша тема.

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

A--(1-n)-->B--(1-n)-->C

Эти привязки (скажем, слева направо) должны иметь конфигурацию fetch = FetchType.EAGER, чтобы вы могли получить все B и C с одним выбором для A.

Как и ожидалось, существует соединение справа налево для сопоставления, которое является многими к одному. Это сопоставление может быть EAGER или нет, решать вам.

Важный момент для EAGER: если ваши объекты относятся ко многим и используется EAGER, это может привести к инициации для выбора всех данных БД. Это следует всегда иметь в виду.
Образец:

public class A {    
    ...
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "a")
    @Fetch(FetchMode.SELECT)
    public List<B> getBs() {
        return this.bs;
    }       
    ...
}

public class B {        
    ...
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "IDPKA")
    public A getA() {
        return this.a;
    }
    ... 
}
person hsnkhrmn    schedule 04.12.2015
comment
Спасибо за ваше мнение. Я уже создал некую сущность с тем же подходом, которым вы поделились. И дела идут очень хорошо. Даже ЭГЕР неплох. Я обновлю вопрос соответственно. Но я хочу сказать, что IDPKC может иметь одинаковое значение, но разные CPK1. в этом случае будет какая-то проблема - person Partha Sarathi Ghosh; 05.12.2015