【问题标题】:Implementing Collections based (DDD) Repository with Hibernate使用 Hibernate 实现基于集合 (DDD) 的存储库
【发布时间】:2009-09-03 15:31:55
【问题描述】:

我正在尝试查看是否可以将存储库实现为java.util.Collection(很可能是Map)。

类似的东西:

@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 发出非常愚蠢的请求
  • 同步

在我的域模型中,很多时候将 DB 视为 List/Map/Set 会很有用,因此尝试使用标准 java.util 接口来实现这一点似乎是明智的。

有没有这样的例子?我是否会因为尝试通过 Hibernate 将 Comparable.compareTo 操作向下推送到数据库之类的事情而跌倒?

【问题讨论】:

    标签: java hibernate domain-driven-design


    【解决方案1】:

    在休眠状态下,存储库的大致等价物是DAO。您可能会看一下该模式以及他们如何在该链接上实现它;您可能可以将其演变成类似存储库的东西。

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

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

    【讨论】:

    • 是的,我熟悉DAO模式,我只是想看看是否可以公开一个java.util.Collection Repository。事务将在服务层进行划分,上面的代码只是我玩的结果。仍然希望有人能给我指出一些探索这个想法的代码或文章。
    猜你喜欢
    • 2019-06-01
    • 2010-11-24
    • 1970-01-01
    • 2019-04-23
    • 2011-03-24
    • 2011-01-07
    • 1970-01-01
    • 2013-12-05
    • 2014-10-18
    相关资源
    最近更新 更多