Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Hibernate实现基于集合(DDD)的存储库_Java_Hibernate_Domain Driven Design - Fatal编程技术网

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发出非常愚蠢的请求
  • 同步化
在我的域模型中,很多时候将DB视为List/Map/Set是有用的,因此尝试使用标准java.util接口实现这一点似乎是明智的


有这样的例子吗?如果我想通过Hibernate将
操作下放到数据库中,那么我是否会在尝试类似于推送
Compariable这样的事情时脸红呢?

在Hibernate中,大致相当于存储库的是。你可以看看这个模式,以及他们是如何在这个链接上实现它的;您可能会将其演变为类似于存储库的东西

在许多n层体系结构中,事务语义是在与DAO不同的层上处理的。因此,您可能需要重新考虑该部分,或者找到将它们集成到存储库中的方法


<>为了避免不必要的或重复的交互,你可以考虑使用第二级缓存。

<>在Hibernate中,库的粗略等价物是。你可以看看这个模式,以及他们是如何在这个链接上实现它的;您可能会将其演变为类似于存储库的东西

在许多n层体系结构中,事务语义是在与DAO不同的层上处理的。因此,您可能需要重新考虑该部分,或者找到将它们集成到存储库中的方法


<>为了避免不必要的或重复的交互,你可以考虑使用第二级缓存。

是的,我熟悉DAO模式,我只想看看是否有可能公开JavaUTILITY集合库。事务将在服务层取消标记,上面的代码只是我玩的结果。仍然希望有人能给我指出一些探索这个想法的代码或文章。是的,我熟悉DAO模式,我只是想看看是否有可能公开java.util.Collection存储库。事务将在服务层取消标记,上面的代码只是我玩的结果。仍然希望有人能给我指出一些探索这个想法的代码或文章。