2016-02-11 15 views
16

現在、私は永続性管理に関するいくつかの軽微な要件を備えたJava EEプロジェクトに取り組んでいます。ユーザーによるエンティティへの変更は、検証される前に作業コピーに適用される必要があります。その後、それらは「ライブデータ」に適用されます。そのライブデータの変更には、監査を可能にするために、その一部のレコードも必要です。JPAの変更されたプロパティの追跡

エンティティはJPAで管理され、Hibernateはプロバイダとして使用されます。それは与えられたものなので、私たちはHibernate固有のものから恥ずかしがります。最初の要件では、2つのパーシスタンスユニットが使用されます。エンティティは「ライブデータ」テーブルにマッピングされ、もう1つは「作業コピー」テーブルにマッピングされます。 2番目の要件では、ユースケースに適したHibernate Enversを使用します。

これまでのところとても良いです。さて、ユーザが(ウェブベースの)フロントエンド上のデータを見るとき、現存するデータと比較して作業コピーでどのフィールドが変更されたのかを示すことは非常に便利です。異なる色で十分です。このためには、どのプロパティが変更されたかを知る方法が必要です。私の質問は、これについてどうやって行くのがよいでしょうか?

JavaBeans APIを使用すると、PropertyChangeListenerは、作業コピーのエンティティの変更を通知し、それらのセットを保持すれば十分です。しかし、アプリケーションを再起動したり、変更を有効にしてライブデータに適用したりする前に、変更を長期間に渡すことができるため、セットも永続化する必要があります。また、必要になるたびに作業コピーを取得するために変更をライブデータに適用することは実現不可能です(したがって2つの永続ユニット)。 作業コピーと実際のデータを比較して、異なるフィールドを見つけることもできます。一部のイントロスペクションとリフレクション・コードで十分ですが、実際にはライブ・データをフェッチする必要はありません。 多分私は単純なものが欠けているかもしれません。あるいは誰かが私が使うことができる素晴らしいJPA/Hibernate機能について知っています。このような情報をライブデータに適用するまで別のデータベーステーブルを作成することを避けることはできませんが、このシナリオを使ったいくつかのベストプラクティスまたは実際の体験は非常に便利です。

私はそれが半開きの質問であることを認識していますが、確かに他の人はこのような要件に遭遇したに違いありません。良い提案があれば歓迎されています。既成のソリューションへのポインタは、受け入れられた答えとしては良い候補になります。

+0

あなたは休止状態を試みましたか? –

+0

@XavierDury変更の履歴を保持するためにEnversを使用することは、ポストで明示的に言及されています。私が探しているのは、特定のエンティティでどのプロパティが変更されたかを知るための生き方です。エンティティの2つのバージョンを表示するたびにそれらを比較する必要はありません。 –

+1

@G_H私の知る限りでは、同じエンティティの2つのバージョンを読み込んで値を比較するのは本当に悪いですか?私は、これらの実体について何か「特別な」ものがあるのでしょうか?永続性レイヤーをできるだけリーンに保つと、パフォーマンス上の問題になることはありません。 – Bonifacio

答えて

1

おそらく、Hibernateのフラッシュエンティティイベントリスナーを使用できます。汚れたプロパティは、フラッシュする前に計算されます。データベースのどこかに保存することができます。

sample codeあなたのアイデアを与えるかもしれないHibernateのダーティプロパティ機能を使用しています。

+0

最終的にはこれを実際には必要とせず、単に作業コピーをユーザに提示するだけです。変更された点を明示的にマークする必要がある場合は、フラッシュ・リスナーがおそらく最良のアプローチであると思われますので、これを受け入れたものとしてマークします。私は、org.hibernate.EmptyListenerクラスが汚いプロパティを見つけるための基盤を提供できると考えます。あなたのリンクは404'dなので、汚れた物の扱いをカスタマイズする方法に関する情報を提供するいくつかのSOの質問/回答で置き換える方が良いかもしれません。 –

関連する問題