問題タブ [hibernate-envers]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Hibernate Envers を使用して子エンティティのマップを値として監査する
エンティティをマップ内の値としてParent
参照するエンティティがあります。Child
マップのキーは列挙型です (簡単なコードについては以下を参照してください)。残念ながら@AuditJoinTable
、テーブル名を使用すると、期待される「parent_children_aud」テーブルが作成されません。
マップ参照の監査はサポートされていますか? それとも、私が間違っていることがありますか?
休止状態 3.6.0 を使用します。
親クラス:
子クラス:
マイ列挙:
hbm.xml:
hibernate - org.hibernate.tool.EnversSchemaGeneratorを使用してEnversデータベーススキーマを生成する方法は?
Hibernateを4.1.1.Finalバージョンに更新しました。ドキュメントによると 、データベーススキーマを生成する方法は2つあります。
- Antタスク
org.hibernate.tool.ant.EnversHibernateToolTask
。 - Javaから実行
org.hibernate.tool.EnversSchemaGenerator
します。
Hibernate-toolsはHibernate-4.1.1.Finalでは機能しません。ブロッキングバグがあります。
リリースノートとテストケースしか見つかりませんでした。org.hibernate.tool.EnversSchemaGenerator
では、persistence.xmlとMavenでどのように使用できますか?
アップデート:
Hibernateフォーラムで関連スレッドが見つかりました。私の質問に対する答えはまだないようです。
sql - 内側のクエリで最大値を選択 < 外側のクエリで別の値を選択
Trip_aud と Event_aud という 2 つの監査テーブルがあります。それらは Envers で作成されましたが、SQL でクエリを実行しています。これらは基本的にドメイン テーブルと同じですが、変更があるたびにリビジョン値が増加し、監査テーブルにいくつかのタプルが挿入されます。
Trip が特定のステータス ( PLANNING
-> EXECUTING
) から変更されると、現在のリビジョンを保存するので、その後、実行されたもの (出発時間など) と計画されたものを比較できます。これらのイベント (出発、停止、待機中...) は、Trip へのポインターと共に Event に格納されます。イベントも監査されます。
Envers は CVS システムのように機能します: 特定のリビジョンで何らかの要素を照会すると、特定のリビジョンよりも小さい最大リビジョンを持つタプルが検索されます。私が興味を持っているリビジョンは、状態が変化したときに保存される Trip のものです。特定のリビジョンの旅行からすべてのイベントを選択するにはどうすればよいですか?
テーブルの外観は次のとおりです。org_rev
ステータスが変更される出張リビジョンです。
リビジョン 3 の旅行とイベントが必要な場合は、
リビジョン 44 で、計画が終了した時点で、
計画と実行を比較するために次のクエリを作成しましたが、何も返されません! EVENT_AUD で自己結合を行い、リビジョンの順序のみが異なるタプルの重複を排除し、トリップ時rev
よりも小さい最大値を選択しようとしますorg_rev
。
t.org_rev
不思議なことに、 44に置き換えるとうまくいきます。私は何を間違っていますか?
助けてくれてありがとう!
メタ: CSV、XML、INCLUDE INTO などで、私が求めている SQL を人々がテストできるように、データベースの例を少し提供することは期待されていますか? 質問に添付するにはどうすればよいですか?
java - Hibernate Envers:コレクションプロパティを持つエンティティの正しいリビジョンを取得する
監査対象のエンティティAとBが2つあります。エンティティAはエンティティBのコレクションを保持しています(1対多の関係として注釈が付けられています)。Aの新しいインスタンスをデータベースに挿入すると、AとBのすべての行が同じリビジョン(たとえばリビジョン1)になります。次に、エンティティBのインスタンスにのみ影響するAの更新があります。したがって、更新後も、エンティティAはリビジョン1のままですが、Bのエンティティはリビジョン2です(監査テーブルのMODエントリを含む)。 。リビジョン3では、エンティティAが削除されます。エンティティBのコレクションには@Cascadeの注釈が付けられているため、Aに属するエンティティBも削除されます。
このシナリオで、リビジョン2の更新されたエンティティBを持つエンティティAのインスタンスを取得するEnversで監査クエリを作成するにはどうすればよいですか?エンティティAのすべてのリビジョンをクエリすると、Bのエンティティを持たないAの削除されたエンティティ(リビジョン3)を取得するか、リビジョン1のBエンティティを保持するリビジョン1のAも取得します。
それが役立つ場合は、Hibernate3.6を使用します。
hibernate - Gradleを介したHibernate4.1.2.finalの構築に関する問題
HHH-6960が原因で休止状態にパッチを適用しようとしています。ただし、を実行すると次の問題が発生しgradle clean build
ます。
これは、変更を加えることなく、箱から出してすぐに使用できます...休止状態とgradleをダウンロードして、実行しました。私はgradleを初めて使用するので、何が間違っているのでしょうか。
前もって感謝します。
java - 変更されたエンティティに対して承認/拒否の概念を使用する可能性はありますか?
私は現在 envers を調査し、ドキュメントに取り組んでいます。Envers が満たさない私の要件の 1 つがあります (私が今考えているように)。たぶんそうで、誰かが私に何かを指摘したり、これに対する別の解決策を持っている可能性があります。
要件は、2 番目のユーザーが変更されたデータを確認する必要があることです。2 番目のユーザーは、変更を承認するか拒否するかを選択できます。承認時に変更を行い、拒否時に変更をロールバックする必要があります。envers はこれをサポートしていますか、それとも元のデータベース テーブルに独自の「承認済み」フラグを挿入する必要がありますか?
java - Hibernate Envers によって管理される監査テーブルの主キーは何ですか?
Hibernate Envers を使用していくつかのエンティティを監査しています。関連する監査テーブルを手動で作成しました。しかし、監査テーブルの主キーがどうあるべきかを判断するのに苦労しています。たとえば、顧客を格納するために設計された架空のテーブルを考えてみましょう。
そして、監査テーブルを作成します。
私が検討したオプションは次のとおりです。
主キー:REVISION_ID
同じリビジョン中に同じクラスの複数のエンティティが変更される可能性があるため、これを主キーにすることはできません。
主キー: ( REVISION_ID
, CUSTOMER_ID
)
これは可能性が高いようですが、Envers がリビジョンごとに顧客ごとに複数のレコードを挿入するかどうかはわかりません。
主キー: ( REVISION_ID
, REVISION_TYPE_ID
, CUSTOMER_ID
)
これはやり過ぎのように思えますが、Envers がリビジョンごとに顧客ごとに異なるタイプのレコード ( add
、modify
または) を挿入する可能性があります。delete
主キー: 新しい列
おそらく、主キーは、合成主キーを含む別の列でなければなりません。
Hibernate Envers によって管理される監査テーブルの真の主キーは何ですか?
hibernate - リレーションの監査済みリビジョンを取得する方法は?
これが私のユースケースです
Personn と Email (@OneToMany 関係) の 2 つのエンティティがあります。どちらも監査を受けています。
最初に、電子メールを使用して新しい Personn を作成します (=> どちらもリビジョン 1 です)。次に、電子メールを変更します (=> 電子メールにはリビジョン 2 がありますが、Personn にはリビジョン 1 しかありません)。
Web アプリケーションでは、エンドユーザーは、ユーザーの属性と電子メールの属性を表示するビューを 1 つしか持っていません。このビューでは、この Personn の既存のすべてのリビジョンを表示したいと考えています。しかし、監査システムにクエリを実行すると、Personn が変更されていないため、リビジョン 2 が表示されません。
技術的な問題は理解していますが、エンドユーザーの観点から見ると、彼は担当者の電子メールを変更したため、リビジョン 2 を見たいと考えています。彼は、私たちがこれらの情報を 2 つの Java オブジェクトに分割することを決定したことを知りません (知る必要もありません)。もちろん、この問題は Personn-Email の関係だけではありません (私は Personn と、同じビューに表示される他のオブジェクトとの間に多くの関係を持っています - 住所、仕事、サイト、カードなど)
私は2つの解決策について考えました:
1- リビジョンが存在するかどうかを知るためにすべてのリレーションを照会します (ただし、大きなリクエストまたは複数のリクエストが生成されると思います - 私はたくさんのリレーションを持っています)。
2-「hibernate.listeners.envers.autoRegister」を false に設定し、独自の EnversIntegrator とイベントの実装を作成します。イベント実装 (デフォルトの Envers 実装をオーバーライドします) では、Email の属性が変更されたときに Personn 用の ModWorkUnit を作成します (もちろん、ハード コードされていません: personn フィールドに @AuditedPropagation のようなカスタム アノテーションを付けます)。このソリューションの欠点は、変更されていない場合でも、Personn の行が大量に作成されることです。
これらのソリューションについてどう思いますか? そのようなユースケースを解決するためのより良い方法を知っていますか?
アドバイスありがとうございます。
hibernate - Envers Validity 監査戦略のバグの可能性 - 誰でも確認できますか?
JBoss AS 7 で Seam 2 アプリケーションを実行しています。エンティティの履歴リビジョンへのアクセスを高速化するために、Envers Validity Audit Strategy に切り替えました。すべて問題ないように見えましたが、特定のタイプのエンティティを保存すると、
エラー。Validity Audit Strategy をオフにすると、問題が解決しました。
Validity Audit Strategy で成功した人はいますか (ドキュメントには実験的であると書かれています)。
Hibernate 3.6.8.Final を使用していることを指摘しておく必要があります。
hibernate-envers - Hibernate Envers : OneToMany リレーションの所有側でリビジョンを追跡します
A と B の 2 つの監査済みエンティティがあります。エンティティ A は、エンティティ B のコレクションを保持しています (1 対多の関係として注釈が付けられています)。A の新しいインスタンスをデータベースに挿入すると、A と B のすべての行が同じリビジョン (リビジョン 1 としましょう) になります。次に、エンティティ B のインスタンスにのみ影響する A の更新があります (カスケード タイプはマージです)。したがって、更新後、エンティティ A はまだリビジョン 1 のままですが、B のエンティティはリビジョン 2 (監査テーブルの新しい MOD エントリ) です。
問題は、A のすべてのリビジョンを取得するときに、2 つのリビジョンが返されることを期待することです。1 つは作成用、もう 1 つは所有する B のコレクションの変更用です。ManyToMany の場合でもこの動作を取得できますが、 OneToMany 関係と同じように機能しないでください。
(私は Hibernate 3.6.10-Final を使用しています)