Подтвердить что ты не робот

Практическая практика JPA: объекты статического поиска

Представьте, что объект Событие ссылается на объект Статус:

@Entity
@Table(name = "event")
public class Event()
{
  @Id
  @Column(name = "id", nullable = false)
  private long id;
  ...

  @ManyToOne
  @JoinColumn(name = "status_code", nullable = false)
  private Status status;
}


@Entity
@Table(name = "status")
public class Status()
{
  @Id
  @Column(name = "code", nullable = false)
  private String code;

  @Column(name = "label", nullable = false, updatable = false)
  private String label;
}

Статус отображается в маленькую таблицу 'status'. Статус - это типичный справочный файл/объект поиска.

   code  label
   ----- --------------
   CRD   Created
   ITD   Initiated
   PSD   Paused
   CCD   Cancelled
   ABD   Aborted

Я не уверен, что неплохо моделировать Статус как сущность. Это больше похоже на перечисление констант...

Сопоставляя Статус как объект, я могу использовать объекты состояния в Java-коде, а значения статуса одинаково присутствуют в базе данных. Это полезно для отчетности.

С другой стороны, если я хочу установить конкретное состояние для события, я не могу просто назначить постоянный статус, который я имею в виду. Сначала я должен искать правильную сущность:

event.setStatus(entityManager.find(Status.class, "CRD"))

Могу ли я избежать фрагмента кода выше? Я боюсь за штраф исполнения, и он выглядит очень тяжелым...

  • Нужно ли мне настраивать атрибуты только для чтения?
  • Можно ли предварительно запрограммировать эти объекты поиска и использовать их в качестве констант?
  • Я пропустил важную функцию JPA?
  • ...

Все мнения/предложения/рекомендации приветствуются!

Спасибо! J.

4b9b3361

Ответ 1

Могу ли я избежать фрагмента кода выше? Я боюсь за штраф за исполнение, и он выглядит очень тяжелым?

Ну, вместо этого вы можете использовать enum. Я действительно не понимаю, почему вы этого не делаете.

Но если вы действительно хотите использовать сущность, это будет идеальным кандидатом для кэширования 2-го уровня, и это решит вашу проблему с производительностью.

Ответ 2

Вы можете использовать entityManager.getReference(Status.class, "CRD"), который может не извлекать объект из базы данных, если он используется только для установки внешнего ключа.