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

Как узнать, сохранился ли отдельный объект JPA или нет?

У меня есть экземпляр сущности JPA в слое веб-интерфейса моего приложения. Я хотел бы узнать в любое время, если этот объект уже сохранен в базе данных или если он присутствует только в сеансе пользователя.

Это было бы в бизнес-слое, я бы использовал метод entitymanager.contains(Entity), но в моем слое пользовательского интерфейса я думаю, мне нужен дополнительный атрибут, указывающий, сохранен ли объект или нет. Как это реализовать? Я рассматриваю следующий вариант на данный момент:

  • атрибут JPA со значением по умолчанию, заданным базой данных, но заставит новое считывание после каждого обновления?
  • атрибут non JPA, установленный вручную в моем коде или автоматически установленный JPA?

Любые советы/другие предложения?

Я использую JPA 1 с внедрением Hibernate 3.2 и предпочитаю придерживаться стандарта.

4b9b3361

Ответ 1

Во-первых, позвольте напомнить различные состояния сущности. Из спецификации JPA 1.0 (в разделе 3.2 Жизненный цикл экземпляров сущностей):

В этом разделе описывается Операции EntityManager для управления жизненный цикл экземпляров объекта. субъект может быть охарактеризован как новый, управляемый, отстраненный или удалены.

  • Объект сущности new имеет отсутствие постоянной идентификации и еще не установлен связанные с контекстом персистентности.
  • A управляемый экземпляр сущности - это экземпляр с постоянным идентификаторомкоторый в настоящее время связан с контекстом персистентности.
  • A отсоединенный экземпляр сущности - это экземпляр с постоянным идентификатором(или не более), связанный с контекстом персистентности.
  • Объект сущности удален - это экземпляр с постоянным идентификатором, связанный с контекстом персистентности, который планируется удалить из базы данных.

И графическая иллюстрация:

alt text

Итак, по определению, отдельный объект уже сохранен, и я действительно не думаю, что это ваш реальный вопрос. Теперь, если вы хотите узнать, является ли сущность новой (т.е. Не имеет постоянной идентификации), как насчет этого:

@Transient
public boolean isNew() {
    return (this.id == null);
}