2016-10-13 4 views
0

Spring-Bootアプリケーション内で、永続コンテキストからエンティティを切り離す必要があります。Springデータリポジトリ(Spring 4)を使用している場合、永続コンテキストからエンティティを切り離す方法

私は、次のベースリポジトリがあります。

interface EntityRepository extends CrudRepository<Entity, Long> 

は明らかにこれは、任意のdetach(..) -operationを提供していませんが。 私は実際に私のために働いていない答えを見つけました: SO Post

私は同じことをしようとしたが、それは私のエンティティが切り離されていないようだ(イムは、任意のフィールドを変更するかのように、それはまだ持続します)

カスタムレポ:

interface MyCustomEntityRepository { 
    void detach(Entity ent) 
} 

インタフェースのImpl:

class MyCustomEntityRepositoryImpl implements MyCustomEntityRepository{ 
    @PersistenceContext 
    private EntityManager em; 

    public void detach(Entity ent) { 
     em.detach(ent); 
    } 
} 

しかし、これは、その結果として、私は、MyCustomEntityReposityEntityRepositoryを拡張カント:

No property detach found for type Entity! EntityRepositoryを拡張しないことで、エラーなくコンパイルできました。またchangin CrudRepositoryJpaRepository しかし、私のエンティティは分離されていませんが、リンク先のポストでは、QAはそれが彼/彼女のために働いていると言います。 オブジェクトをデタッチする実際の理由は、@EntityListener内のいくつかのバリデーションを実行することです。デタッチする必要がある、現在変更されているエンティティインスタンスを使用して、dbに現在格納されているエンティティをチェックします。

誰かが何かエラーを見たり、手がかりを与えてくれますか?私は間違って何をしていますか?

使用:春ブーツ(1.4.0リリース)、春4を、JPA

+0

これは一回限りの必要条件ですか、アプリケーション内のすべてのエンティティに対してこの機能を使用しますか? – manish

+0

私は1つのエンティティに対してのみ必要ですが、一般的なアプローチにも興味があります – lunatikz

+0

単一のエンティティのみの場合は、 '@PersistenceContext EntityManager entityManager;として' EntityManager'をautowireしてください。エンティティインスタンスを 'entityManager.detach(entity)'としてデタッチできます。これはカスタムコーディングを必要としないので簡単です。すべてのエンティティでこれが必要な場合は、[公式ドキュメント](http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.custom-behaviour-for-all-リポジトリ)のJPAリポジトリのカスタム動作を制御します。 'CrudRepository'を拡張してリポジトリに' detach'メソッドを含めることができます。 – manish

答えて

1

誰もが、Imは間違って何をやっていくつかのエラーを参照するか、私に手掛かりを与えていますか?

あなたの実際の問題の一部は何か、ちょっとした質問編集ではないかもしれませんが、わかりにくいですが。

  1. あなたのインターフェースは

    interface MyCustomEntityRepository { 
        detach(Entity ent) 
    } 
    

    はおそらく

    interface MyCustomEntityRepository { 
        void detach(Entity ent) 
    } 
    
  2. する必要がありますコンパイルされません、カスタムインタフェースの実装では、インターフェイスを実装する必要があります。

    class MyCustomEntityRepositoryImpl { 
    

    は、おそらく問題が解決しない場合

    class MyCustomEntityRepositoryImpl implements MyCustomEntityRepository { 
    

は、あなたがスタックトレースを含め、実際の例外を除いて使用している実際のコードを表示してくださいする必要があります。

+0

遅く返事を申し訳ありません。はい、コード内のエラーは、不適切な質問の編集のために起こりました。代わりに別のエンティティインスタンスの変更を解析し、2つの別々のエンティティインスタンスで検証を実行できるようにすることで、デタッチをまったく使用しないことで解決できました。エンティティリスナと分離を達成するために数日後にもう一度試してみることにします。私は自分自身でそれに興味があります。私はここで返信します。遅れて申し訳ありません – lunatikz

関連する問題