Размещение только идентификатора однонаправленного отношения многие к одному - PullRequest
0 голосов
/ 07 июня 2019

Я отправляю запрос POST (JSON) для создания нового экземпляра Person, и каждый Person должен иметь связанный с ним статус.Существует предварительно заполненная таблица «Состояние» с ограниченным количеством статусов.Является ли просто отправка идентификатора сущности статуса лучшим подходом здесь?

В настоящее время я отправляю только идентификатор сущности статуса в моем запросе, но это означает загрузку статуса из БД с использованием идентификатора и добавление егопереходному лицу, прежде чем оно будет сохранено заранее, чтобы удовлетворить ограничения JPA / DB, но это неэффективно.

Тело запроса (усеченное для краткости) отправлено в PersonDTO:

{
    "name" : "Dave",
    "statusId" : "1",
    ::
}

Сущность статуса

@Entity
public class Status {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Long id;

    @Column
    private String status;
}

Лицо сущности

@Entity
public class Person {

   @Id
   @GeneratedValue(strategy = GenerationType.SEQUENCE)
   private Long id;

    @ManyToOne(optional = false)
    @JoinColumn(name = "status_id")
    private Status status;
    ::

Является ли наилучшим способом фактической отправки объекта состояния в запросе JSON, поэтому мне не нужно выполнять какой-либо поиск по идентификатору состояния?

{
    "name" : "Dave",
    "status" : {
      "id" : 1
      "status" : "AVAILABLE"
    },
    ::
}

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

1 Ответ

1 голос
/ 07 июня 2019

1) Как только вы начнете использовать Native SQL, вы начнете использовать его во все большем количестве мест. В конечном итоге вы потеряете независимость от поставщика базы данных, которую дает вам JPA. Я не говорю, что это на 100% плохо, я просто говорю ..

2) Вы можете применить кэш второго уровня для Status, так как это похоже на словарную таблицу:

@Entity
@Cacheable

3) Если вы не планируете вносить какие-либо изменения в сам объект состояния, вы должны загрузить его, не используя findById, который идет в базу данных, но используйте getOne вместо этого, который только создает ссылку и должен быть достаточным в вашем случае.

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