2009-09-03 8 views
1

J'essaie de voir s'il est possible d'implémenter un référentiel en tant que java.util.Collection (très probablement un Map).Implémentation du référentiel Collections (DDD) avec Hibernate

Quelque chose le long de ces lignes:

@Repository 
public abstract class HibernateRepository<K extends Serializable, V> 
    extends AbstractMap<K, V> { 

    @Autowired 
    private SessionFactory sessionFactory; 

    private Class<K> keyClass; 
    private Class<V> valueClass; 

    public HibernateRepository(Class<K> keyClass, Class<V> valueClass) { 
     this.keyClass = keyClass; 
     this.valueClass = valueClass; 
    } 

    @Override 
    @SuppressWarnings("unchecked") 
    public V get(Object key) { 
     return (V) sessionFactory.getCurrentSession() 
           .get(valueClass, (Serializable) key); 
    } 

    @Override 
    @Transactional 
    public Set<java.util.Map.Entry<K, V>> entrySet() { 
     return new EntrySet(sessionFactory.getCurrentSession()); 
    } 

    private class EntrySet extends AbstractSet<java.util.Map.Entry<K, V>> { 

     private Session session; 

     public EntrySet(Session session) { 
      this.session = session; 
     } 

     @Override 
     public Iterator<java.util.Map.Entry<K, V>> iterator() { 
      // Hibernate Criteria doesn't do Iterator 
      // so would probably a fair bit of manual work 
      // if multiple DB requests are to be avoided 
     } 
     @Override 
     public int size() { 
      return (Integer) session.createCriteria(valueClass) 
            .setProjection(Projections.rowCount()) 
            .uniqueResult(); 
     } 
    } 
} 

public class FooRepository extends HibernateRepository<Integer, Foo> { 
    public FooRepository() { super(Integer.class, Foo.class); } 

    // domain specific queries/methods... 
    public Foo findMagicOne(....) { ... } 
} 

questions évidentes que je peux voir sont

  • en essayant d'éviter les demandes vraiment stupides à la DB
  • syncronization

Dans mon domaine modèle il y a beaucoup de fois il serait utile de traiter la base de données comme List/Map/Set, Donc essayer d'y parvenir en utilisant les interfaces java.util standard semble raisonnable.

Y a-t-il des exemples là-bas? Vais-je tomber sur mon visage en essayant de faire des choses comme pousser les opérations Comparable.compareTo jusqu'à la base de données via Hibernate?

Répondre

1

En veille prolongée, l'équivalent approximatif d'un référentiel est le DAO. Vous pourriez jeter un coup d'oeil à ce modèle et comment ils l'implémentent à ce lien; vous pourriez probablement faire évoluer cela vers quelque chose comme un dépôt.

Dans de nombreuses architectures n-tiers, la sémantique transactionnelle est gérée à un niveau différent de celui du DAO. Vous pouvez donc vouloir reconsidérer cette partie ou trouver un moyen de les intégrer dans le référentiel. Pour éviter les interactions inutiles ou en double, vous pouvez envisager d'utiliser un cache de second niveau.

+0

Oui, je suis familier avec le modèle DAO, je veux juste voir s'il est possible d'exposer un dépôt java.util.Collection. Les transactions seraient démarquées à la couche de service, le code ci-dessus était juste le résultat de moi jouant. J'espère toujours que quelqu'un peut me diriger vers un code ou un article explorant cette idée. – ptomli

Questions connexes