2010-11-30 14 views
5

これは履歴データ処理に関する問題です。 では、次のようなMyClassクラスがあるとします。履歴データをJavaおよびHibernateで保存する

class MyClass { 
    String field1; 
    Integer field2; 
    Long field3; 

    getField1() {...} 
    setField1(String ...) {...} 

    ... 
} 

私は古いデータを格納および取得するのMyClassができるようにする必要があるとし、これを行うための最善の方法は何ですか?
の要件は、Hibernateを通じてクラスを永続化することです。 "エンティティ"あたり最大2つのテーブルを持つようにしてください:「連続性」クラス(時間の経過とともに進化するエンティティを表すもの)と、履歴データの別のテーブルhere
フィールドの値に任意の有効な時間を割り当てることができなければならないことに注意してください。私は現在、JTemporalライブラリを使用していて、それがマップのようなものですTemporalAttribute<T>クラス、持ってい

class MyClass { 
    // how to store the fields???? 

    getField1At(Instant i) {...} 
    setField1At(Instant i, String ...) {...} 

    ... 
} 

:あなたが取得するT myAttr.get(Instant i)のようなものを行うことができますが

クラスのようなインターフェースを持っている必要がありますInstant iのmyAttrのバージョン。私は、TemporalAttributeをHibernateを持つテーブルに永続化する方法を知っています(単純です:TemporalAttributeによって使用されるSortedMapを保持し、開始時刻と終了有効時刻と属性値を持つテーブルを取得します)。
本当の問題は、ここに複数の属性があることです。
私は念頭に置いていますが、明確ではないので、あなたのアイデアを聞きたいと思います。

答えて

0

ドメインクラスにバージョン番号を追加するだけで、このようなことを行うことができます。私はIDがdb割り当て番号とバージョン番号の複合体であったような何かをしましたが、私はそれに反対します。通常のサロゲートキーを使用し、本当に必要ならば[id、version]タプルを自然なキーにします。

実際には、グラフ上のすべての要素でバージョン番号が同じであることを確認するだけで、オブジェクトグラフ全体をバージョン管理することができます。これで、以前のバージョンに簡単に戻ることができます。

バージョンを管理するコードの完全性を保証するために、多くのサービステストを作成する必要があります。

5

あなたのプロジェクトは私にHibernate Enversを思い出させます。

Enversプロジェクトは、永続クラスの監査を容易にすることを目的としています( )。あなたがしなければならない は、あなたが@Auditedで、 を監査することを、あなたの 永続クラスまたはその プロパティの一部に注釈を付けています。監査された各 エンティティに対して、テーブル が作成され、 の変更の履歴を保持します。 を検索し、ヒストリカルデータをクエリすると、多くの手間が省けます( )。

  • あなたは(属性ごとに)監査するものを選択し、独自のリビジョンエンティティを作る(そのようなリビジョン番号、作者、タイムスタンプとしてその店舗の情報...)

エンティティとリビジョンデータ(データベースとコード内)を切り離すために、Hibernate Enversを使用します。

+0

私はEnversマニュアルを読みましたが、リビジョンに開始と終了の有効時間を割り当てることが可能かどうかを理解することはできませんでした。これは、リビジョンを保存するだけでなく、リビジョンが有効であった時間を設定するために必要なものです。 – cdarwin

+0

独自のリビジョンエンティティ(http://docs.jboss.org/envers/docs/index.html#revisionlogを参照)を実装し、カスタムタイムスタンプを追加することができます。それはあなたが探しているものですか? –

+0

私が見た限りでは、有効な日付を追加のリビジョンデータに挿入すると、Enversクエリで指定することはできません(これについては完全にはわかりません)。私は、Envers(http://jboss.org/envers/downloads/envers_seam_demo.zip)で利用可能なビットマップデータベースのコードを掘り下げています。サンプルコードでも、フィールドは「通常の」クラスに属していますかなり古いです。しかし、「ローカルな」データ、つまり特定のエンティティのリビジョンに関連するデータが必要な間に、より大きな問題があります(あなたのリンクからの引用):「リビジョンはグローバルなので、最大で1つのリビジョンエンティティを持つことができます」 – cdarwin

関連する問題