2009-09-03 3 views
1

リポジトリをjava.util.Collection(おそらくMap)として実装することが可能かどうかを確認しようとしています。これらの線に沿ってコレクションベース(DDD)リポジトリをHibernateで実装する

何か:私は見ることができます

@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

  • のsyncronization
  • には本当に愚かな要求を避けるためにしようと

    • ですモデルでは、DBをList/Map/Setとして扱うと便利なことが多いでしょうが、標準のjava.utilインタフェースを使ってこれを達成しようとするのは分かりやすいようです。

      これの例はありますか? Comparable.compareTo操作をHibernateを介してDBにプッシュするようなことをしようとすると、私は自分の顔に倒れそうですか?

    答えて

    1

    hibernateでは、リポジトリとほぼ同等のものがDAOです。そのパターンを見て、そのパターンでそのパターンを実装する方法があります。おそらくそれをリポジトリのようなものに進化させることができます。

    多くのn層アーキテクチャでは、トランザクションセマンティクスはDAOとは異なる層で処理されます。したがって、その部分を再考したり、リポジトリに統合する方法を見つけることができます。

    不要な、または重複する対話を避けるために、第2レベルのキャッシュを使用することを検討してください。

    +0

    ええ、私はDAOパターンに精通しています。java.util.Collectionリポジトリを公開することができるかどうかを確認したいだけです。トランザクションはサービス層で識別されますが、上記のコードは私が再生した結果です。まだ誰かがこのアイデアを探るコードや記事を指し示すことを期待しています。 – ptomli

    関連する問題