Есть ли способ использовать справочную таблицу в качестве конвертера в JPA? - PullRequest
0 голосов
/ 15 апреля 2020

Представьте, что у меня есть простая сущность:

@Entity
@Table(name = "PERSON")
public class Person {

@Id
@Column(name = "NAME")
private String name;

@Column(name = "GENDER")
private String gender;
}

И две таблицы, фактическая таблица, содержащая информацию, и таблица поиска.

TABLE PERSON (
NAME VARCHAR2 NOT NULL,
GENDER INT NOT NULL);

TABLE GENDER_LOOKUP (
GENDER_ID INT NOT NULL,
GENDER_NAME VARCHAR2 NOTNULL);

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

  1. Создайте перечисление и используйте порядковый номер перечисления для сохранения. Я бы предпочел избежать этого, потому что я хотел бы иметь только один «источник правды» для информации и по различным деловым причинам, это должна быть справочная таблица.

  2. Используйте @ Конвертер аннотации и написать собственный конвертер. Я думаю, что это потребует от меня запроса к таблице, чтобы вытащить соответствующую строку, поэтому это будет означать, что мне придется делать вызов JPA в базу данных каждый раз, когда что-то конвертируется.

В настоящее время я планирую использовать 2, но мне было интересно, есть ли способ сделать это в самой базе данных, поскольку я предполагаю, что использование JPA для выполнения всех этих операций стоит дороже, чем если бы я делал все в база данных. По сути, попытка сохранить пол String, а затем база данных будет просматривать таблицу поиска и переводить ее на правильный Id и сохранять его.

Я специально использую openJpa, но, надеюсь, это не спецификация реализации c.

1 Ответ

0 голосов
/ 15 апреля 2020

Поскольку вы серьезно рассматривали возможность использования enum, это означает, что GENDER_LOOKUP - это состояние c, т. Е. Содержимое не изменяется во время работы программы.

Из-за этого вам следует использовать вариант 2, но конвертер кэширует / загружает все записи из GENDER_LOOKUP при первом поиске. Таким образом, у вас все еще есть только один «источник правды», без затрат на попадание в базу данных при каждом поиске.

Если вам нужно добавить новый пол 1 , вы просто нужно перезапустить приложение, чтобы обновить sh кеш.

1) В наши дни, кто знает, какие новые гендеры понадобятся.

...