7

データベース内のほぼすべてのテーブルには、作成、更新、および削除されたステータス(日付とユーザー名)をログに記録する監査テーブルへのFKがあります。

監査テーブルをAuditingクラスにマップし、次のように使用します。

@MappedSuperclass
public class BusinessObject extends DataObject {

    private static final long serialVersionUID = -1147811010395941150L;

    @OneToOne(fetch = FetchType.EAGER, cascade = { CascadeType.ALL })
    @JoinColumn(name = "AUD_ID")
    private AuditingObject auditing;
...

ご想像のとおり、ほぼすべてのエンティティがBusinessObjectから拡張されています。

すべてのbusinessObjectについて、「auditing.deletedisnull」のみを受け取るという簡単な言い方はありますか。

businessObjectに@Whereと@WhereJoinTableを追加しようとしましたが、期待どおりに機能しないようです。

現在、クエリの1つに対してこれを実行しましたが、これは機能しますが、約150あるため、すべてのクエリに対してこれを実行するのは嫌です。

@NamedQuery(
    name="allCountries",
    query="SELECT c FROM Country c"
        + " LEFT JOIN FETCH c.labelDefinition "
        + " LEFT JOIN FETCH c.labelDefinition.translations "
        + " WHERE c.auditing.deleted is null"
        + " ORDER BY c.code"
)
4

1 に答える 1

12

IMO、ソフト削除を実装する最も簡単な方法は、エンティティにフラグを追加して使用することです。

  • デフォルトの@SQLDeleteHibernate をオーバーライドするdelete(そしてフラグの更新を実行する)アノテーション
  • 削除されたエンティティをフィルタリングするためのエンティティと関連付けの@Where(または?) 注釈@Filters

Auditingただし、これがテーブルにどのように適合するかはわかりません。さらなる調査とテストが必要です。

資力

于 2010-10-21T15:50:18.793 に答える