Java 使用Hibernate实现基于集合(DDD)的存储库
我试图看看是否可以将存储库实现为Java 使用Hibernate实现基于集合(DDD)的存储库,java,hibernate,domain-driven-design,Java,Hibernate,Domain Driven Design,我试图看看是否可以将存储库实现为java.util.Collection(很可能是映射) 大致如下: @Repository public abstract class HibernateRepository<K extends Serializable, V> extends AbstractMap<K, V> { @Autowired private SessionFactory sessionFactory; private Cl
java.util.Collection
(很可能是映射
)
大致如下:
@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(....) { ... }
}
@存储库
公共抽象类HibernateRepository
扩展抽象地图{
@自动连线
私人会话工厂会话工厂;
私有类密钥类;
私人阶级价值阶级;
公共HibernateRepository(类keyClass、类valueClass){
this.keyClass=keyClass;
this.valueClass=valueClass;
}
@凌驾
@抑制警告(“未选中”)
public V get(对象键){
return(V)sessionFactory.getCurrentSession()
.get(valueClass,(可序列化)键);
}
@凌驾
@交易的
公共集入口集(){
返回新的EntrySet(sessionFactory.getCurrentSession());
}
私有类入口集扩展了抽象集{
非公开会议;
公共入口集(会话){
this.session=会话;
}
@凌驾
公共迭代器迭代器(){
//Hibernate条件不支持迭代器
//所以可能需要相当多的体力劳动
//如果要避免多个DB请求
}
@凌驾
公共整数大小(){
返回(整数)会话。createCriteria(valueClass)
.setProjection(Projections.rowCount())
.uniqueResult();
}
}
}
公共类FooRepository扩展了HibernateRepository{
公共FooRepository(){super(Integer.class,Foo.class);}
//特定于域的查询/方法。。。
公共Foo findMagicOne(..){…}
}
我能看到的明显问题是
- 试图避免向DB发出非常愚蠢的请求
- 同步化
有这样的例子吗?如果我想通过Hibernate将
操作下放到数据库中,那么我是否会在尝试类似于推送Compariable这样的事情时脸红呢?在Hibernate中,大致相当于存储库的是。你可以看看这个模式,以及他们是如何在这个链接上实现它的;您可能会将其演变为类似于存储库的东西
在许多n层体系结构中,事务语义是在与DAO不同的层上处理的。因此,您可能需要重新考虑该部分,或者找到将它们集成到存储库中的方法
<>为了避免不必要的或重复的交互,你可以考虑使用第二级缓存。 <>在Hibernate中,库的粗略等价物是。你可以看看这个模式,以及他们是如何在这个链接上实现它的;您可能会将其演变为类似于存储库的东西
在许多n层体系结构中,事务语义是在与DAO不同的层上处理的。因此,您可能需要重新考虑该部分,或者找到将它们集成到存储库中的方法
<>为了避免不必要的或重复的交互,你可以考虑使用第二级缓存。是的,我熟悉DAO模式,我只想看看是否有可能公开JavaUTILITY集合库。事务将在服务层取消标记,上面的代码只是我玩的结果。仍然希望有人能给我指出一些探索这个想法的代码或文章。是的,我熟悉DAO模式,我只是想看看是否有可能公开java.util.Collection存储库。事务将在服务层取消标记,上面的代码只是我玩的结果。仍然希望有人能给我指出一些探索这个想法的代码或文章。