gpt4 book ai didi

java - 使用 Hibernate 实现基于集合 (DDD) 的存储库

转载 作者:太空宇宙 更新时间:2023-11-04 08:59:03 24 4
gpt4 key购买 nike

我正在尝试查看是否可以将存储库实现为 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(....) { ... }
}

我可以看到的明显问题是

  • 尽量避免向数据库发出非常愚蠢的请求
  • 同步

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

有这样的例子吗?我是否会因为试图通过 Hibernate 将 Comparable.compareTo 操作推送到数据库而陷入困境?

最佳答案

在 Hibernate 中,存储库的大致等效项是 DAO 。您可以查看该模式以及他们如何在该链接上实现它;您可能可以将其发展为类似存储库的东西。

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

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

关于java - 使用 Hibernate 实现基于集合 (DDD) 的存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1374164/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com