JPAエンティティのcreatedByとupdatedByを自動的に設定する
質問
私は JPA (Hibernate 実装)、Spring、Stripes Web アプリに取り組んでいます。監査とクエリの両方の目的で共通の次のフィールドを持つ JPA エンティティが多数あります。
createdBy - エンティティを作成した人のユーザー ID。createdon-エンティティが更新された日付 - エンティティアップデートを最後に更新した人のユーザーID-エンティティが最後に更新された日付
エンティティが永続化されるときにcreatedOnとupdatedOnが自動的に設定されるようにアプリを動作させましたが、現在ログインしているユーザーのIDをずっとパススルーせずにcreatedByフィールドとupdatedByフィールドにデータを設定する方法がわかりません。コントローラークラスからDAOまで。
ユーザーIDをあちこちに渡さずにこれを行う方法について誰かが提案を持っていますか?現在、現在のユーザー ID は HttpSession オブジェクトに保存されているため、バックエンドは何らかの方法でこのデータにアクセスする必要があることに注意してください。
ありがとう!
解決 2
私はThreadLocalのはおそらく私のアプリケーションでこれを行うにはクリーンな方法であることを決めました。
他のヒント
ユーザー ID をビジネス層のコンテキストとして渡すには、次のいずれかのアプローチを参照してください。
(EJB を使用していない場合でも、投稿は関連性がある可能性があります。ただし、2 番目の投稿は JTA で Spring を使用する場合にのみ意味があります)
私は個人的にこれらのアプローチには 2 つの問題があると認識しているため、推奨しません。
- テスト容易性:テストではコンテキスト データを設定する必要があります
- 契約:コンテキスト データはエンティティを使用するためのコントラクトに参加しますが、インターフェイスでは明確に表示されません。
userID を「あらゆる場所に」渡すのは大変な作業のように思えるかもしれませんが、そのほうがクリーンだと思います。
エンティティの作成または更新時に日付とユーザー ID を自動的に設定するには、 EntityListener またはライフサイクル コールバック (もしかしたらすでにそうしているかもしれません)。それが役に立てば幸い...
私はこのようなクラスを作成したい:
@MappedSuperclass
public abstract class AuditableDomainClass {
private long createdBy;
private long updatedBy;
//getters and setters
あなたが説明してきた要求は、単純に、このクラスを拡張します持っているあなたのエンティティクラスは、あなたがあなたが(例えばコントローラ)に必要な層内の変数を設定したいとあなたはそれについてのすべての方法を心配する必要はありません。 DAOを中にダウンします。