これは履歴データ処理に関する問題です。 では、次のような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を保持し、開始時刻と終了有効時刻と属性値を持つテーブルを取得します)。
本当の問題は、ここに複数の属性があることです。
私は念頭に置いていますが、明確ではないので、あなたのアイデアを聞きたいと思います。
私はEnversマニュアルを読みましたが、リビジョンに開始と終了の有効時間を割り当てることが可能かどうかを理解することはできませんでした。これは、リビジョンを保存するだけでなく、リビジョンが有効であった時間を設定するために必要なものです。 – cdarwin
独自のリビジョンエンティティ(http://docs.jboss.org/envers/docs/index.html#revisionlogを参照)を実装し、カスタムタイムスタンプを追加することができます。それはあなたが探しているものですか? –
私が見た限りでは、有効な日付を追加のリビジョンデータに挿入すると、Enversクエリで指定することはできません(これについては完全にはわかりません)。私は、Envers(http://jboss.org/envers/downloads/envers_seam_demo.zip)で利用可能なビットマップデータベースのコードを掘り下げています。サンプルコードでも、フィールドは「通常の」クラスに属していますかなり古いです。しかし、「ローカルな」データ、つまり特定のエンティティのリビジョンに関連するデータが必要な間に、より大きな問題があります(あなたのリンクからの引用):「リビジョンはグローバルなので、最大で1つのリビジョンエンティティを持つことができます」 – cdarwin