我不确定这就是您所寻找的,但在我的应用程序中我正在使用描述的DAO
图案与Spring
所以我对需要多少个存储库感到困惑。
恕我直言,每个实体至少需要一个存储库,因为它们会导致简单的设计,但由于您使它们通用并且它们处于层次结构中,因此可以简单地与子类/接口一起使用
下面是例子
定义常用基本方法的接口
public interface GenericDAO<T, ID extends Serializable> {
T findById(ID id, LockModeType lock);
void save(T entity);
T update(T entity);
List<T> findAll();
}
通用实施
public abstract class GenericDAOImpl<T, ID extends Serializable> implements GenericDAO<T, ID> {
@PersistenceContext
protected EntityManager em;
private final Class<T> entityClass;
public GenericDAOImpl(Class<T> entityClass) {
this.entityClass = entityClass;
}
@Override
public T findById(ID id, LockModeType lock) {
return em.find(entityClass, id, lock);
}
@Override
public void save(T entity) {
em.persist(entity);
}
@Override
public T update(T entity) {
return em.merge(entity);
}
@Override
public List<T> findAll() {
CriteriaQuery<T> c = em.getCriteriaBuilder().createQuery(entityClass);
c.select(c.from(entityClass));
return em.createQuery(c).getResultList();
}
.
.
.
}
Foo类
@Entity
public class Foo implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String text;
}
Foo 存储库
public interface FooRepositiry extends GenericDAO<Foo, Long> {
Foo findTextById(Long id);
}
实施 Foo 存储库
@Transactional
@Repository
public class FooRepoImpl extends GenericDAOImpl<Foo, Long> implements FooRepositiry {
public FooRepoImpl() {
super(Foo.class);
}
@Override
public Foo findTextById(Long id) {
CriteriaQuery<Foo> c = em.getCriteriaBuilder().createQuery(Foo.class);
// .
// .
// .
return em.createQuery(c).getSingleResult();
}
}
Bar 类也一样
@Transactional
@Repository
public class BarRepoImpl extends GenericDAOImpl<Bar, Long> implements BarRepo {
public BarRepoImpl() {
super(Bar.class);
}
@Override
public List<Bar> findAllBarWithText(String text) {
CriteriaQuery<Bar> c = em.getCriteriaBuilder().createQuery(Bar.class);
return em.createQuery(c).getResultList();
}
}
在这里,这个通用实现需要两个东西才能工作:一个 EntityManager 和一个
实体类。子类必须提供实体类作为构造函数参数。 EntityManager 是通过使用提供的PersistenceContext
或者你可以使用getter-setter
方法相同。自从GenericDAOImpl
是抽象的,因此您不能直接使用它,而是间接使用它,并且大多数常用方法都是通用的并且处于层次结构中,这使得它们成为重用的理想候选者。
您可以从书中阅读更多相关内容Java 持久化与 Hibernate 第二版 https://www.manning.com/books/java-persistence-with-hibernate-second-edition