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