2010-12-29 26 views
3

Hibernateに取り組んでいる間、我々はHibernate Docでも述べたように汎用Hibernate DAOパターンに従っています。Hibernateでの汎用DAOパターン

そこで、この上に標準persistannce方法横何ら提案された新しいメソッドが存在しない場合でも、ように動作している場合、我々は、現在Implimentationので

ためのインタフェース 2)のための2つの平行hirarchies 1)を保持しているこの通り我々そのエンティティのためのマーカインタフェースとそのImplimentationを作成する必要があります。

このアプローチと明確な分離では問題はないようですが。

任意のより良い方法/代替方法が

答えて

8

Umeshは、私たちは、この機能

インターフェイスを実装する方法を紹介します、事前にこの

感謝が実現するならば、私の質問は

public interface Repository<INSTANCE_CLASS, PRIMARY_KEY_CLASS> { 

    void add(INSTANCE_CLASS instance); 
    void merge(INSTANCE_CLASS instance); 
    void remove(PRIMARY_KEY_CLASS id); 
    INSTANCE_CLASS findById(PRIMARY_KEY_CLASS id); 
    INSTANCE_CLASS findById(PRIMARY_KEY_CLASS id, Class fetchingStrategy, Object... args); 
    List<INSTANCE_CLASS> findAll(); 
    List<INSTANCE_CLASS> findAll(Class fetchingStrategy, Object... args); 
    List<INSTANCE_CLASS> findAll(int pageNumber, int pageSize); 
    List<INSTANCE_CLASS> findAll(int pageNumber, int pageSize, Class fetchingStrategy, Object... args); 
    List<INSTANCE_CLASS> findAllByCriteria(Criteria criteria); 
    List<INSTANCE_CLASS> findAllByCriteria(Criteria criteria, Class fetchingStrategy, Object... args); 
    List<INSTANCE_CLASS> findAllByCriteria(int pageNumber, int pageSize, Criteria criteria); 
    List<INSTANCE_CLASS> findAllByCriteria(int pageNumber, int pageSize, Criteria criteria, Class fetchingStrategy, Object... args); 

} 

通常、上に示した方法のすべてを必要としないため、抽象的なあなただけのメソッドを追加する必要がリポジトリをしたい場合は、他の開発者がアクセスしようとした場合にダミー実装今

public abstract class AbstractRepository<INSTANCE_CLASS, PRIMARY_KEY_CLASS> implements Repository<INSTANCE_CLASS, PRIMARY_KEY_CLASS> { 

    public void add(INSTANCE_CLASS instance) { 
     throw new UnsupportedOperationException("Not supported yet."); 
    } 

    public void merge(INSTANCE_CLASS instance) { 
     throw new UnsupportedOperationException("Not supported yet."); 
    } 

    public void remove(PRIMARY_KEY_CLASS id) { 
     throw new UnsupportedOperationException("Not supported yet."); 
    } 


    public INSTANCE_CLASS findById(PRIMARY_KEY_CLASS id) { 
     throw new UnsupportedOperationException("Not supported yet."); 
    } 

    public INSTANCE_CLASS findById(PRIMARY_KEY_CLASS id, Class fetchingStrategy, Object... args) { 
     throw new UnsupportedOperationException("Not supported yet."); 
    } 

    public List<INSTANCE_CLASS> findAll() { 
     throw new UnsupportedOperationException("Not supported yet."); 
    } 

    public List<INSTANCE_CLASS> findAll(Class fetchingStrategy, Object... args) { 
     throw new UnsupportedOperationException("Not supported yet."); 
    } 

    public List<INSTANCE_CLASS> findAll(int pageNumber, int pageSize) { 
     throw new UnsupportedOperationException("Not supported yet."); 
    } 

    public List<INSTANCE_CLASS> findAll(int pageNumber, int pageSize, Class fetchingStrategy, Object... args) { 
     throw new UnsupportedOperationException("Not supported yet."); 
    } 

    public List<INSTANCE_CLASS> findAllByCriteria(Criteria criteria) { 
     throw new UnsupportedOperationException("Not supported yet."); 
    } 

    public List<INSTANCE_CLASS> findAllByCriteria(Criteria criteria, Class fetchingStrategy, Object... args) { 
     throw new UnsupportedOperationException("Not supported yet."); 
    } 

    public List<INSTANCE_CLASS> findAllByCriteria(int pageNumber, int pageSize, Criteria criteria) { 
     throw new UnsupportedOperationException("Not supported yet."); 
    } 

    public List<INSTANCE_CLASS> findAllByCriteria(int pageNumber, int pageSize, Criteria criteria, Class fetchingStrategy, Object... args) { 
     throw new UnsupportedOperationException("Not supported yet."); 
    } 

} 

ことを目的としたクラスは、例えば、あなたは

public class PersonRepository extends AbstractRepository<Person, Integer> { 

    public void add(Person instance) { 
     /** 
      * person implmentatiuon goes here 
      */  
    } 

} 

を使用することができますメソッドを追加する以外は、UnsupportedOperationException

基準は単なるマーカーインターフェイスです

public interface Criteria {} 

いくつかのメソッドの目的は、パラメータ、クラスfetchingStrategy が外部化という名前のクエリを一致させることです定義します。このようにして、エラーが発生しやすい手書き文字列は避けます。このアプローチは、たとえば、グループのプロパティを検証するために、JSR-303 Bean検証によって使用されます。私はアドレスを使用して、人のすべてを取得したいときに、私は呼ん

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
    <query name="PERSON_WITH_ADDRESS"> 
     <![CDATA[ 
      from 
       Person p 
      left join fetch 
       p.address 
     ]]> 
    </query> 
</hibernate-mapping> 

次のようにhere

public class Person { 
    public static interface PERSON_WITH_ADDRESS {} 
} 

を参照してください。クエリという名前の外部化が示され

PersonRepository<Person, Integer> respository ... 

List<Person> personList = repository.findAll(PERSON_WITH_ADDRESS.class); 

のfindAllは次のように記述することができ

public class PersonRepository extends AbstractRepository<Person, Integer> { 

    List<Person> findAll(Class fetchingStrategy, Object... args) { 
     if(fetchingStrategy.isAssignableFrom(PERSON_WITH_ADDRESS.class)) { 
      sessionFactory.getCurrentSession() 
          .getNamedQuery(fetchingStrategy.getSimpleName()) 
          .list(); 
     } 

     throw new UnsupportedOperationException("Not supported yet."); 
    } 

} 
+0

実際には良いと非常に有益な答え –

+0

@umesh awasthi私の答えはあなたのニーズをfullfilまたは有用である場合、受け入れられたとして印を付けるか、それをUPvoteを与える。ありがとうございました! –

+0

人のクラスで静的な最終文字列に反対のマーカーインターフェイスを使用するメリットを説明/リンクできますか? –

関連する問題