2012-02-19 3 views
2

のために拡張していますジェネリック、ワイルドカードやスーパー/ Iは、次のJPAエンティティの継承階層を持つインターフェース

  • 抽象アカウント
  • ChildminderAccountはアカウント
  • ParentAccountアカウント
  • 私は希望

を拡張を拡張します私のDAOインターフェイス、すなわち3つのインターフェイスで同じ種類の継承階層を持つようにする:

  • AccountDAO
  • ChilminderAccountDAO
  • ParentAccountDAO

ここ例えば両方ChilminderAccountDAOとParentAccountDAOインターフェースに共通のメソッドを保持する私のベースDAOインタフェースである:

import org.springframework.data.jpa.repository.Modifying; 
import org.springframework.data.jpa.repository.Query; 
import org.springframework.data.repository.CrudRepository; 
import org.springframework.data.repository.query.Param; 
import org.springframework.transaction.annotation.Transactional; 

import com.bignibou.domain.Account; 

public interface AccountDAO extends CrudRepository<Account, Integer> { 

    @Modifying 
    @Transactional 
    @Query("UPDATE Account a SET a.accountValidated = false WHERE a.accountToken = ?1") 
    int deactivateAccountFromToken(String accountToken); 

    @Modifying 
    @Transactional 
    @Query("UPDATE Account a SET a.accountValidated = true WHERE a.accountToken = ?1") 
    int reactivateAccountFromToken(String accountToken); 

    @Query("SELECT COUNT(a) FROM Account a WHERE a.accountEmailAddress = :accountEmailAddress") 
    long checkIfEmailAddressAlreadyExists(@Param("accountEmailAddress") String accountEmailAddress); 

    Account findByAccountToken(@Param("accountToken") String accountToken); 

    Account findByAccountEmailAddress(@Param("accountEmailAddress") String accountEmailAddress); 
} 

Iは、次にしようとしました私のChildminderDAOインターフェイスを次のように定義します。 public interface ChildminderAccountDAO extends CrudRepository<? super Account, Integer>, AccountDAO結果は

タイプChildminderAccountDAOは、 CrudRepositoryを拡張または実装できません。

インターフェースCrudRepositoryが 異なる引数で複数回実施することができない:CrudRepositoryと CrudRepository

もたらす public interface ChildminderAccountDAO extends CrudRepository<ChildminderAccount, Integer>, AccountDAO:スーパータイプは、私も試み ワイルドカード

を指定しなくてもよいです

いずれも機能しません。サブインターフェイスにジェネリックス/ワイルドカードを指定する方法がわかりませんスーパーインターフェース内で両方に共通のメソッドを実行し、サブインターフェースがそれぞれのタイプのエンティティ、すなわちChildminderAccountおよびParentAccountで動作することを可能にする。

誰でも私のサブインターフェイスを定義する方法を教えていただけますか?

答えて

4

コンパイラは、何が間違っているかについてかなり明確になっています(これはすばらしい変更です)。

ワイルドカード型を拡張できないため、最初の試行は不正です。

汎用バインディングを異なるタイプバインディングで2回継承することができないため、2回目の試行は不正です。 ChildminderAccountDAOCrudRepository<ChildminderAccount, Integer>AccountDAOの両方に拡張され、AccountDAO自体はCrudRepository<Account, Integer>に拡張されます。

あなたが使用する必要があるアプローチは、AccountDAO自体をアカウントのタイプの汎用とすることです。 CrudRepositoryを一般的に拡張するために、その型節の変数をextends節に使用することができます。サブクラスは、その型パラメータを特定の型にバインドできます。Like:

public interface AccountDAO<A extends Account> extends CrudRepository<A, Integer> 

public interface ChildminderAccountDAO extends AccountDAO<ChildminderAccount> 

public interface ParentAccountDAO extends AccountDAO<ParentAccount> 
+0

ありがとうTom! – balteo

関連する問題