web-dev-qa-db-ja.com

デタッチされたJPAエンティティがすでに永続化されているかどうかを知る方法は?

アプリケーションのWebUIレイヤーにJPAエンティティインスタンスがあります。このエンティティがすでにデータベースに永続化されているのか、それともユーザーセッションにのみ存在するのかをいつでも知りたいのですが。

それはビジネス層にあり、entitymanager.contains(Entity)メソッドを使用しますが、UI層では、エンティティが保存されているかどうかを示す追加の属性が必要だと思います。それをどのように実装しますか?私は今のところ次のオプションを検討しています:

  • データベースによってデフォルト値が設定されたJPA属性ですが、更新のたびに新しい読み取りを強制しますか?
  • コードに手動で設定された、またはJPAによって自動的に設定された非JPA属性?

アドバイス/その他の提案はありますか?

私はHibernate3.2実装でJPA1を使用しており、標準に固執することを好みます。

27
snowflake

まず、エンティティのさまざまな状態を思い出してみましょう。 JPA 1.0仕様(セクション3.2エンティティインスタンスのライフサイクル)から:

このセクションでは、エンティティインスタンスのライフサイクルを管理するためのEntityManager操作について説明します。エンティティインスタンスは、新規、管理、デタッチ、または削除されたものとして特徴付けることができます。

  • newエンティティインスタンスには永続IDなしがあり、永続コンテキストにはまだ関連付けられていません。
  • 管理対象エンティティインスタンスは、現在永続コンテキストに関連付けられているインスタンス永続IDを持つです。
  • 切り離されたエンティティインスタンスはインスタンスです永続的なIDを持つ永続コンテキストに関連付けられていない(または関連付けられていない)。
  • 削除済みエンティティインスタンスは、永続コンテキストに関連付けられた永続IDを持つインスタンスであり、データベースからの削除がスケジュールされています。

そして、グラフィカルなイラスト:

alt text

したがって、定義上、分離されたエンティティはすでに永続化されており、これがあなたの本当の質問であるとは実際には思いません。ここで、エンティティがnewであるかどうか(つまり、永続的なIDがないかどうか)を知りたい場合は、次のようにします。

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