2010-12-29 2 views
3

Während wir am Hibernate arbeiten, folgen wir dem generischen Hibernate DAO-Muster, wie es auch in Hibernate Doc erwähnt wird.Generisches DAO-Muster in Hibernate

So wie pro das wir derzeit Beibehaltung von zwei parallel hirarchies 1) für Schnittstellen 2) für implimentation

so, wenn wir auch auf diese so funktionieren, wenn es keine vorgeschlagene neue Methode neben Standard persistannce Methoden ist, dass wir müssen eine Marker-Schnittstelle für diese Entity sowie ihre Implimentation erstellen.

Obwohl in diesem Ansatz und seiner klaren Trennung kein Problem scheint.

meine Frage ist, ob es eine bessere Weg/alternative Art und Weise diesen

Vielen Dank im Voraus zu erreichen

Antwort

8

Umesh ich Ihnen zeigen, wie wir

Die Schnittstelle

diese Funktionalität implementieren

Da Sie normalerweise nicht alle oben gezeigten Methoden benötigen, erstellen wir eine Zusammenfassung Klasse mit dem Ziel, eine Dummy-Implementierung

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."); 
    } 

} 

Nun ist, zum Beispiel, wenn Sie ein Repository wollen die Methode nur hinzufügen muss, können Sie

public class PersonRepository extends AbstractRepository<Person, Integer> { 

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

} 

Wenn andere Entwickler versuchen, zuzugreifen verwenden andere als Methode hinzufügen, wird er oder sie UnsupportedOperationException

Criteria erhalten ist nur eine Markierungsschnittstelle.

public interface Criteria {} 

Der Zweck einiger Methoden definieren einen Parameter Klasse fetchingStrategy ist externalisiert benannten Abfragen entsprechen. Auf diese Weise vermeide ich handcodierte Zeichenketten, die fehleranfällig sind. Dieser Ansatz wird von der JSR-303-Bean-Validierung verwendet, um beispielsweise Gruppen von Eigenschaften zu validieren. Siehe here

public class Person { 
    public static interface PERSON_WITH_ADDRESS {} 
} 

Die Abfrage mit dem Namen externalize als

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

So angezeigt, wenn ich alle Personen mit Adresse abrufen möchten, rufen Sie i

PersonRepository<Person, Integer> respository ... 

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

findAll kann geschrieben werden

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

das ist wirklich eine gute und sehr informative Antwort –

+0

@umesh awasthi Wenn meine Antwort Ihre Bedürfnisse erfüllen oder nützlich ist, markieren Sie als akzeptiert oder gibt es UPvote. Vielen Dank! –

+0

können Sie erklären, was der Vorteil der Verwendung von marker interface im Gegensatz zu einer statischen endgültigen Zeichenfolge in der Personenklasse ist, ty –