gpt4 book ai didi

java - 如何创建提供 crud 操作的通用 DAO,而无需通过不提供其他方法的自定义 DAO 对其进行扩展

转载 作者:行者123 更新时间:2023-11-30 07:59:55 28 4
gpt4 key购买 nike

我有通用的 DAO:

@NoRepositoryBean
interface ICrudDao<T, ID extends Serializable> extends Repository<T, ID> {
void delete(T deleted);

List<T> findAll();

T findOne(ID id);

T save(T persisted);
}

为了允许服务在上面工作,我必须创建允许自定义实体获得持久性的接口(interface),例如:

interface TodoDao extends ICrudDao<Todo, Long> {

}

我有很多像 TodoDao 这样的 daos。然后不要提供任何特殊方法。

创建大量空接口(interface)似乎是个愚蠢的想法。如何创建一个通用的?

最佳答案

编辑:我不认为你正在尝试做的是一个好主意。起初为每个实体注册一个存储库似乎是样板代码,但随着应用程序的增长,它将帮助您维护它。想象一下您的应用程序像这样随着时间的推移而发展:

  1. 您创建了一个简单的实体 Person 和接口(interface) PersonRepository。幸运的是,所有基本的 CRUD 操作都包含在内,到目前为止它满足您的需求,因此您无需执行其他操作。
  2. 随着您的应用程序的增长,Person 会获得很多关联关系,例如 Address、Job、Hobbies,每次访问它时都获取所有关联数据会非常低效,因为并非总是需要每个关联。要遇到这种情况,您可以在 PersonRepository 中创建自己的方法,该方法执行您自己的 NamedQuery 以仅加载某些字段并将其存储在特定 View 所需的 DTO 中(“SELECT new package.PersonDto(x,y) FROM PERSON WHERE ... ).
  3. 随着时间的推移,您发现自己处于需要以动态方式执行查询的情况,例如只需要在特定条件下添加的分页或限制。因此,您创建了一个新接口(interface) PersonCustomRepository 和 PersonCustomRepositoryImpl,您可以在其中以编程方式编写查询:

    @PersistenceContext
    private EntityManager entityManager;

    @Transactional
    public List<Person> foo() {
    // example for accessing hibernate directly, you could also use QueryDSL and so on
    Criteria basicCriteria = entityManager.unwrap().createCriteria(Person.class);
    if (someCondition) {
    criteria.add(Restrictions.eq("foo", foo));
    ...
    }
    ...
    return criteria.list();
    }

底线:Spring 数据存储库已经为您做了很多工作,而且它们很容易扩展,不要试图对抗您的框架,即使它可能在一开始就为您节省一些点击次数地方。

关于java - 如何创建提供 crud 操作的通用 DAO,而无需通过不提供其他方法的自定义 DAO 对其进行扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38918008/

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