【问题标题】:Spring MVC project architecture doubts - DAO, Models, ServicesSpring MVC 项目架构疑惑——DAO、Models、Services
【发布时间】:2018-11-16 15:22:46
【问题描述】:

我正在努力寻找我的 Spring 项目架构的最佳实践。 目前,我们公司有很多项目都使用的大型数据库模式,我们只使用了一个子集,更准确地说是 10 个表。我们的应用程序正在使用 DAO 层来访问这些表。

表的构造通常使它们在所有其他属性旁边具有活动标志、时间戳和状态标志。

我们的 DAO 层自动装配 jdbcTemplate(我们没有使用任何类型的 ORM)。现在,第一个问题来了,我们的许多 DAO 层都有常规的 CRUD 操作 + 许多“更新方法”,DAO 变得臃肿。对于每个新的用例,我们都需要向接口和实现添加新方法。视觉演示:

public class Employee {
    private Integer id;
    private Integer first;
    private Integer second;
    private Integer third;
    private Integer foreignId;
    private Integer sts;
    private Integer activityMark;
    private Timestamp tstam;
}


public class EmployeeDao {
    Employee get(Integer id);
    Collection<Employee> getAll();
    void remove(Integer id);
    void updateFirst(Integer id);
    void updateSecond(Integer id);
    void updateThird(Integer id);
    void updateSts(Integer id);
    ....
}

另一种选择是使用一种更新方法,但这需要从数据库中进行另一个不必要的查询(全选)。

第二个问题是我们有许多(贫血领域)模型(实体)不遵循表设计——一些复杂模型具有来自许多表的属性,一些汇总模型——只有一些来自表的属性。它们的设计也不一致,有时我们使用组合和聚合,像这样:

public class ModelOne {
    private ModelTwo m2;
    private ModelThree m3;
}

有时只有外键或必要的属性。

它们在DAO中也有对应的方法。有时它们有自己的 DAO 接口和实现,有时它们都与主模型 DAO 一起。我们正在尝试在以表为中心和以模型为中心的 DAO 之间取得平衡。

最后,我们最终得到了很少的服务来自动连接一堆 DAO,这违反了单一责任原则。

我阅读了很多文章,很多讨论,但我觉得没有一篇文章能很好地解决我的问题。 对不起,长篇大论,但我会很感激任何建议。

【问题讨论】:

    标签: java spring model dao jdbctemplate


    【解决方案1】:

    为什么不对接收 Employee 对象作为参数的员工实体只使用一种更新方法? 您可以在 Employee 实例中更新所需的字段。 Hibernate 将负责更新您想要的内容。

    【讨论】:

    • 正如我所说,这是可能的。但是,这需要另一个数据库查询。 Hibernate 不是一个选项,我们公司不使用 ORM 框架,公司政策。
    • @LukaKelava 你也反对 JPA 吗?看到您已经在使用 spring,您可以使用 spring-data-jpa,然后使用存储库来使您的项目变得干净整洁。
    • 不幸的是,没有 jpa。
    猜你喜欢
    • 2016-04-24
    • 1970-01-01
    • 2013-02-24
    • 1970-01-01
    • 2015-06-21
    • 2010-10-01
    • 2021-02-19
    • 1970-01-01
    • 2015-06-07
    相关资源
    最近更新 更多