Практическая практика 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.
Ответы
Ответ 1
Могу ли я избежать фрагмента кода выше? Я боюсь за штраф за исполнение, и он выглядит очень тяжелым?
Ну, вместо этого вы можете использовать enum
. Я действительно не понимаю, почему вы этого не делаете.
Но если вы действительно хотите использовать сущность, это будет идеальным кандидатом для кэширования 2-го уровня, и это решит вашу проблему с производительностью.
Ответ 2
Вы можете использовать entityManager.getReference(Status.class, "CRD")
, который может не извлекать объект из базы данных, если он используется только для установки внешнего ключа.