我正在努力为我的Spring项目的架构寻找最佳实践。目前,我们公司有大型数据库模式,用于许多项目,我们只使用一个子集,更准确地说是10个表。我们的应用程序使用DAO层来访问这些表。
表的构造通常使它们在所有其他属性旁边都有活动标志、时间戳和状态标志。
我们的DAO层自动生成jdbcTemplate (我们没有使用任何类型的对象模型)。现在,第一个问题来了,我们的许多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之间取得平衡。
最后,我们最终得到了几个自动绑定DAO的服务,这违反了单一责任原则。
我读了很多文章,很多讨论,但我觉得它们都不能很好地解决我的问题。说来话长,但我会非常感谢你的任何建议。
发布于 2018-11-16 23:29:24
为什么不只对接收employee对象作为参数的Employee实体使用一个update方法呢?您只需在Employee实例中更新所需的字段。Hibernate将负责更新您想要的内容。
https://stackoverflow.com/questions/53340731
复制相似问题