Я работаю с ненормализованной сторонней базой данных, что означает, что я не могу изменить схему. Я пытаюсь сопоставить таблицы с сущностями JPA, используя Hibernate 5.1
Есть 2 простых таблицы A и B :
| A_ID(pk) | | B_ID(pk) |
------------- -------------
| 1 | | 1 |
------------- | 2 |
-------------
Таблица C имеет составной первичный ключ и имеет отношение «многие к одному» с таблицей A:
| A_ID(pk&fk) | QUANTITY(pk) | VALID_FROM(pk) |
---------------------------------------------------
| 1 | 1 | 2017-05-21 |
| 1 | 1 | 2018-01-01 |
| 1 | 2 | 2017-05-21 |
Таблица D имеет составной первичный ключ:
| A_ID(pk&fk) | QUANTITY(pk) | VALID_FROM(pk) | B_ID(pk&fk) |
--------------------------------------------------------------------
| 1 | 1 | 2018-01-21 | 1 |
| 1 | 2 | 2018-01-21 | 1 |
| 1 | 2 | 2018-05-01 | 2 |
столбец VALID_FROM не является частью условия соединения между таблицами и может принимать любое значение.
Я пытаюсь установить связь между таблицами C и D, но из-за компонента первичного ключа VALID_FORM они не могут быть смоделированы с Many-To-One. А поскольку таблицы соединений нет, они также не могут быть смоделированы с помощью Many-To-Many.
Лучшее решение - создать вид, подобный
CREATE VIEW C_NORM AS
SELECT DISTINCT A_ID, QUANTITY
FROM TABLE_C;
, который будет производить представление C_NORM :
| A_ID(pk&fk) | QUANTITY(pk) |
----------------------------------
| 1 | 1 |
| 1 | 2 |
Создание объекта C_NORM в этом представлении может иметь
- отношение «один ко многим» с таблицей C
- и еще одно отношение «один ко многим» с таблицей D
но я не могу изменить схему, поэтому не могу создать новый вид.
Есть ли способ определить сущность как класс с аннотациями, который в основном основан на собственном запросе SQL, а не на представлении или таблице в БД?