2010-12-29 6 views
3

우리는 Hibernate에서 작업하면서 Hibernate Doc에서도 언급 한 바와 같이 일반적인 Hibernate DAO 패턴을 따르고있다.Hibernate에서 일반 DAO 패턴

그래서 우리는이에 표준 persistannce 방법 옆에는 제안 된 새로운 방법이없는 경우에도 방식으로 작동하는 경우 우리는 현재도 구현 그래서

을위한 인터페이스 2)에 대한 두 개의 병렬 hirarchies 1)를 유지하고이에 따라 우리 그 entiry와 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 validation에 사용됩니다. 내가 주소로 사람을 모두 검색 할 때, 내가 전화

<?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

사용자 클래스의 정적 최종 문자열에 반대되는 마커 인터페이스를 사용하면 어떤 이점이 있는지/설명 할 수 있습니까? –

관련 문제