2016-06-11 7 views
1

JPAとHibernateの新機能です。異なるエンティティに共通のメソッドを作成する方法

私は7つの異なる非関連エンティティA、B、C、D、E、Fを持っています。これらはすべて、id、created_date、およびstatusフィールドを持つPARENTという共通エンティティを拡張しています。

@Modifying 
@Query("update A set status = :status") 
int updateStatus(@Param("status") Boolean status); 

電話番号aRepository.updateStatusのようなものです:

は、方法等は各エンティティリポジトリは(私はARepository、BRepository、CRepository、DRepository、ERepository、FRepositoryを意味する)を持つすべてのエンティティのための真のステータスフィールドをマークするには(true)、bRepository.updateStatus(true)、cRepository.updateStatus(true)など、7つのエンティティすべてに対して...

私は各リポジトリの呼び出しを停止し、commonrepository.updateStatusここで、commonrepositoryはインスタンスであり、オブジェクトは各リポジトリのものです(私は各リポジトリを理解しています私は少し混乱しているので、インターフェイス自体です)。

できますか?

+0

これらのエンティティは同じスキーマにありますか? – Saravana

+0

あなたは無関係ですが、7つのリポジトリすべてがそれぞれのエンティティのステータスを同じ値に設定する必要があるビジネスユースケースがありますか?おそらくデータモデルのリファクタがここに整理されています。 – Naros

答えて

1

あなたのリポジトリがによって与えられた答えをオフに構築するにはCommonRepository

@Repository 
public interface ARepository extends CommonRepository<EntityA, Long> { 

} 

@Repository 
public interface BRepository extends CommonRepository<EntityB, Long> { 

} 
+0

ありがとう – KRS

0

技術的には、すべての更新を行う1つのクラスを作成し、そのクラスがそれぞれの異なるリポジトリで応答するようにプログラミングされたすべてのインターフェイスを実装するようにすることができます。私はそれがあなたのケースを助けるかどうかは正確には分かりませんが、あなたはそれを非常に緊密に結合しているように思えます。

+0

すでにタイトに結合されています。私は、メソッドが子でオーバーライドされている単純なJavaインターフェイスコンセプトに基づいてこれを修正しようとしています。したがって、インタフェースを参照する子クラスのオブジェクトを作成することができます。そのような場合、私は常にinterafce.update()を呼び出します。それぞれのクラスは更新されません。 JPAリポジトリの問題は、エンティティクラスのリポジトリ自体がインタフェースであることです。 – KRS

0

オブジェクトの作成時にデフォルト値を設定します。たぶんデフォルトのコンストラクタがそれを行うための正しい場所になるでしょう。共通エンティティで値を設定するだけです。

@Column(name = "STATUS")  
private boolean status= true; 
+0

リファクタリングコールのリファクタリングはどのように役立ちますか? – KRS

0

を延長するようにしてくださいこのリポジトリに

@NoRepositoryBean 
public interface CommonRepository<T, ID extends Serializable> extends JpaRepository<T, Serializable> { 

    @Modifying 
    @Query("update #{#entityName} set status = :status") 
    int updateStatus(Boolean status); 

    // Other methods 
} 

updateStatusメソッドを追加し、CommonRepositoryNoRepositoryBeanとの注釈を作成することができますUUIDを使用すると、春のvooduで少し質問しているものを実行するラッパーBeanを構築できます。

@Component 
public CommonRepositoryStatusUpdater { 
    // spring will inject this list if it finds any; otherwise it is null. 
    @Autowired(required = false) 
    private List<CommonRepository<?,?>> commonRepositories; 

    // updates the status of any detected CommonRepositories. 
    public void updateStatus(Boolean value) { 
    if (commonRepositories != null) { 
     commonRepositories.forEach(cr -> cr.updateStatus(value)); 
    } 
    } 
} 
関連する問題