1
我試圖看看是否有可能實施存儲庫作爲java.util.Collection
(最有可能Map
)。實施基於集合的(DDD)存儲庫與休眠
東西沿着這些路線:
@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(....) { ... }
}
明顯的問題,我可以看到的是
- 試圖避免真的很傻請求到DB
- 同步化
在我的域名模型有很多次將數據庫視爲List/Map/Set會很有用,所以試圖用標準的java.util接口來實現這一點似乎是明智的。
有沒有這方面的例子呢?我是否會試圖通過Hibernate將Comparable.compareTo
操作推向數據庫?
是的,我熟悉DAO模式,我只想看看是否可以公開一個java.util.Collection存儲庫。交易將在服務層進行分類,上面的代碼只是我玩的結果。仍然希望有人能指點我一些代碼或文章探索這個想法。 – ptomli 2009-09-04 10:18:13