Как узнать, сохранилась ли отдельная сущность JPA или нет? - PullRequest
27 голосов
/ 06 мая 2010

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

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

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

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

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

1 Ответ

46 голосов
/ 06 мая 2010

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

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

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

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

alt text

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

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