java - 架构和项目组织

标签 java hibernate maven jpa architecture

在我的公司,我们正开始进行大规模重构,从自制数据库访问迁移到 Hibernate。 我们希望做到干净,因此我们将使用实体、DAO 等...... 我们使用 Maven,因此我们将有两个 Maven 项目,一个用于实体,一个用于 DAO(这很好,还是将两者放在同一个项目中更好?)。

知道了这一点,我们的问题如下:我们的业务层将使用 DAO。 由于大多数 DAO 方法都会返回实体,因此我们的业务层必须了解实体。因此,我们的业务层必须了解 Hibernate,因为我们的实体将带有 Hibernate 注释(或至少带有 JPA 注释)。 这是一个问题吗?如果是的话,有什么解决方案可以让业务层对数据层有最基本的了解?

谢谢,

塞布

最佳答案

以下是我通常如何对依赖项进行建模以及推理。

  1. 让我们区分 4 件事:

    a.业务逻辑

    b.实体

    c. DAO 接口(interface)

    d. DAO 实现

  2. 对我来说,前三个属于一起,因此属于同一个 Maven 模块,甚至在同一个包中。它们密切相关,其中一个的变化很可能会导致另一个的变化。一起变化的事物应该紧密相连。

  3. DAO 的实现在很大程度上独立于业务逻辑。更重要的是,业务逻辑不应该依赖于数据的来源。这是一个完全独立的问题。因此,如果您的数据今天来自数据库,明天来自网络服务,那么您的业务逻辑不应发生任何变化。

  4. 您是对的,实体上的 Hibernate(或 JPA)注释在某种程度上违反了该规则。您有三个选择:

    a.忍受它。虽然它创建了对 Hibernate Artifact 的依赖关系,但它不会创建对任何 Hibernate 实现的依赖关系。所以在大多数情况下,带有注释是可以接受的

    b.使用xml配置。这将解决依赖性问题,但在我看来,处理基于 xml 的配置的成本相当高。我认为不值得

    c.不要使用 hibernate 。我不认为对注释的依赖是您必须考虑的重要问题。更严重的问题是,Hibernate 具有相当的侵入性。当您浏览对象图时,Hibernate 将触发延迟加载,即在从代码中看不太明显的点执行 sql 语句。这基本上意味着,如果您不小心,您的数据访问代码就会开始泄漏到应用程序的每个部分。人们可以控制住这个问题,但这并不容易,需要非常小心和对 Hibernate 的深入了解,而这是大多数团队在开始使用 Hibernate 时所不具备的。因此,Hibernate(或 JPA)将编写 SQL 语句的简单但乏味的任务与创建软件架构的艰巨任务进行了交换,以保持对大多数不可见的依赖关系的检查。因此,我建议完全避免使用 Hiberante,并尝试一些更简单的方法。我个人对MyBatis寄予厚望,但还没有在实际项目中使用过。

  5. 在我看来,比管理技术层之间的依赖关系更重要的是领域模块的分离。 And I'm not alone with that opinion .

  6. 我只会使用单独的 Artifact (即 Maven 模块)来分离您想要独立部署的东西。例如,如果您有一个富客户端和一个后端服务器,那么两个 Maven Artifact ,再加上第三个用于通用代码的 Artifact 就很有意义。对于其他一切,我只是使用在创建非法依赖项时失败的包和测试。对于那些我使用Degraph的人,但我是该文章的作者,所以我可能有偏见。

关于java - 架构和项目组织,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30120820/

相关文章:

java - Android 中线程如何与监听器交互?

java - HotSwap Wicket HTML 文件在 Intellij maven + tomcat 中不起作用

java - 由于 Hibernate Mapping 需要将某些字段作为 @Transient 但 JSP 无法访问它们

java - 项目在转换为 Maven 后从所有接口(interface)方法被覆盖的地方抛出错误

java - 获取知道包名称的应用程序名称

java - JPA 和 Hibernate 初始化非惰性集合错误

java - 如何在不冒失去对称属性的风险的情况下使用 hibernate 实现相等?

java - 如何使用 Maven 使可执行 jar 在一段时间内选择属性文件

java - Spring 工具套件 - ClassNotFoundException : oracle. jdbc.driver.OracleDriver

java - 如何通过 Flash 文件超链接网页