2009-09-03 37 views
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操作推向數據庫?

回答

1

在休眠中,存儲庫的大致等價物是DAO。你可以看看這個模式,以及他們如何在該鏈接上實現它;你或許可以將它演化爲一個存儲庫。

在很多n層體系結構中,事務語義是在與DAO不同的層處理的。因此,您可能需要重新考慮該部分,或者找到一種將它們集成到存儲庫的方法。

爲了避免不必要或重複的交互,您可以考慮使用二級緩存。

+0

是的,我熟悉DAO模式,我只想看看是否可以公開一個java.util.Collection存儲庫。交易將在服務層進行分類,上面的代碼只是我玩的結果。仍然希望有人能指點我一些代碼或文章探索這個想法。 – ptomli 2009-09-04 10:18:13