2011-01-04 13 views
0

私はデータベースオブジェクトに対するすべての変更を追跡するためにHibernateエンバーを使用しています。これらのオブジェクトは、(単方向)親子関係によって関連付けられることがあります。すべての削除されたオブジェクトを一覧表示すると思われるクエリが必要なので、削除されたオブジェクト(* _audテーブルのrevtype列)をマークするために、enversの監査テーブルに依存しています。ただし、これらのエントリは、親オブジェクトが削除されたときに、自分の子オブジェクトのいずれにも作成されないようです。Hibernate Envers:カスケード削除の監査テーブルにエントリを削除しません。

マイオブジェクトクラスは、次のようになります。

@Entity 
@Audited 
public class MyClass { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Long id; 

@Column(nullable = false, unique = false, length = 1024) 
private String name; 

    // An object can have exactly one parent, but multiple children 
@ManyToOne 
@OnDelete(action = OnDeleteAction.CASCADE) 
private MyClass parent; 

} 

私は疑ってるそれは何とかenversを休止バイパスアクションを削除カスケードとは何かを持っています。参照される親が削除されたときに、すべての子がデータベースによって自動的に削除されることを確認しながら、子オブジェクトの監査テーブルのエントリが作成されるようにするにはどうすればよいですか?

+0

使用しているHibernateとEnversのバージョンは何ですか? – jpkrohling

+0

現在、3.5.2のHibernateディストリビューションを使用しています。私は3.5.6を試しましたが、私は同じ結果を得ています。 –

答えて

2

@OnDelete は、Hibernate経由でDDLを生成していますか?そうであれば、Hibernateは関係の "カスケード削除"を追加します。つまり、子の削除はHibernateの外で行われます。したがって、Envers(またはHibernate)はこのイベントへのアクセス権を持たず、その行為に失敗します。

+0

はい、Hibernateを介してDDLスキーマが作成され、関係の削除ルールは「カスケード」です。削除イベントへのアクセス権を持たないEnversは私が疑っていたものです。だからこれを行う正しい方法は何ですか? –

+0

あなたは子供の視点でそれをマークしているので、イベントはカスケードしていないと思います。だから、 '@OneToMany(cascade = CascadeType.ALL、mappedBy =" parent ")'と注釈されたプロパティ 'private list children 'を追加します。次に、親を削除するたびに、子どもも削除されます。 – jpkrohling

+0

いくつかの考えの後、子供をプログラムで削除することに決めました。子供が削除されたときに子供をチェックする必要がある他の問題があるからです。とにかく、ありがとうございました。 –

関連する問題