2015-09-11 3 views
8

を削除しますが、今、私は、ユーザーがDELETE /accounts/<id>すなわち特定のエンティティに対するDELETE操作を行ったとき、私はマーキングデータベースにフラグを設定する必要があることの要件を持っていますそのエンティティは削除されましたが、私はレコードを保持したいです春データ休憩 - ソフト、私は何の問題もなく春データの残りの部分を使用してきた

は、基本的にこれは、私は、データベース内のDELETE操作の代わりにUPDATEを実行する必要があることを意味します。私は削除(ID)メソッドの春の動作をオーバーライドする方法を見つけることができません。

いくつかのコード:

@Entity 
@Table(name = "account") 
public class Account { 

    /* 
Default value for this field is false but when a receive a 
DELETE request for this entity i want to turn this flag 
to false instead of deleting the record. 
    */ 
    @Column(name = "deleted") 
    private boolean deleted; 

... 
} 

アカウントリポジトリ

@RepositoryRestResource 
public interface AccountRepository extends JpaRepository<Account, Integer> { 

} 

任意のアイデア?

+1

は私の答えを参照してください。 //stackoverflow.com/questions/19323557/handling-soft-deletes-with-spring-jpa/33168644#33168644)私は春のチュートリアルを作成し、以下のエンティティで注釈@SoftDeleteを使用して、これを行うことができた –

答えて

4

あなたはそれが

http://docs.spring.io/spring-data/jpa/docs/1.9.0.RELEASE/reference/html/#repositories.custom-implementations

を再生しかし、削除する方法を確認するために、カスタムリポジトリを作成しようとするだろうが、あなた「だけの場所ではありませんあなたのロジックを変更する必要があります。

  1. はあなたのエンティティ定義に余分なフラグを持っており、削除にそれを更新: 私は、フラグの要求を処理するための2つの方法を参照してください。あなたが注意すると、削除されたエンティティが返されないことを、確認するために、すべての既存のクエリを書き換え、および将来のすべてのエンティティのために、心の中で結果のこの分離を維持する必要があります。この場合

    。 (あなたは低レベルでSpringDataをハックすることができますが、このフラグを自動的に付加します)。

  2. は元のコレクションからエンティティを削除し、エンティティが完全に廃棄する前に保存されている別のコレクションにそれを追加します。この場合

    あなたは処分のコレクションを管理するための追加のロジックを持っている必要がありますが、これは、クエリのロジックには影響を与えません。 [取り扱い-ソフト削除-とスプリングを-JPA](HTTP:あなたはあなたのJPA定義にエンティティリスナーを追加することにより、既存のアプリケーションと統合することができます(http://docs.spring.io/spring-data/jpa/docs/1.9.0.RELEASE/reference/html/#jpa.auditing

+1

感謝を。 (http://docs.spring.io/spring-data/jpa/docs/1.9.0.RELEASE/reference/html/#repositories.custom-implementations) – ejoncas

+2

こんにちはejoncas、あなたはどのようにあなたができるかについて少し詳しく説明できますかその注釈を設定して使用するには? – gtiwari333

+1

@SoftDelete注釈はspring-data-commonによってまだリリースされていないと思います – PRP

0

私は最初に、ソフト削除を使用するエンティティのみを識別するためにインターフェイスを使用する必要があると思います。その後、deleteメソッドをオーバーライドすることができます。エンティティがそのインタフェースのインスタンスである場合、削除されたフラグをtrueに設定し、update updateを呼び出すと、スーパー実装が呼び出されます。 JpaRepositoryの代わりにSimpleJpaRepositoryを使用します。あなたがここに見つけることができますhttps://github.com/danjee/hibernate-mappingsインタフェースのための例(永続およびDefaultPersistent)

関連する問題