2010-12-29 2 views
3

При работе в спящем режиме мы следуем общему шаблону Hibernate DAO, как упомянуто в Hibernate Doc.Общий шаблон DAO в спящем режиме

Так, согласно этому мы в настоящее время поддержание двух параллельных hirarchies 1) для интерфейсов 2) для Implimentation

так что если мы будем работать над этим, как, даже если нет никакого предложен новый метод рядом стандартных методов persistannce мы необходимо создать интерфейс маркера для этого 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, например, для проверки групп свойств. См here

public class Person { 
    public static interface PERSON_WITH_ADDRESS {} 
} 

экстернализовать именованный запрос показан следующим

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

Так что, когда я хочу, чтобы получить все лица, с указанием адреса, я называю

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 Если мой ответ наполнит ваши потребности или полезен, отметьте его как принятый или дайте ему UPvote. Спасибо! –

+0

Не могли бы вы объяснить/увязать, что пользы от использования интерфейса маркера, противоположного статической конечной строке в классе person, ty –

Смежные вопросы