java - 带有 spring 数据的六边形架构

标签 java spring spring-data-jpa hexagonal-architecture

我打算开始一个新项目来学习 spring boot、spring 数据和六边形架构。根据我的理解,六边形架构旨在将核心或域层与数据库操作(基础设施层)分开。我已经看到此架构的以下项目结构。

核心层有:

服务-> 逻辑所在(接口(interface)及其实现)。

实体 -> 这些将在整个应用程序中使用。

Repository->基础设施层必须实现的接口(interface)。

基础设施层实现了存储库接口(interface)、JPA 实体、对数据库的调用( hibernate )以及将 JPA 实体转换为核心实体(映射器?)的某种功能。

Spring Data有一个非常有用的方式来实现CRUD操作:

public interface UserRepository extends JpaRepository<User, Integer> {
}

但是,我认为如果我使用 spring 数据,如果 UserRepository 是核心层的一部分,那么 JPA 实体将不会成为基础结构层的一部分。这意味着核心实体将毫无用处。我应该创建另一个属于核心层的 UserRepository 接口(interface)还是我遗漏了什么?

更新:

我对使用 spring 数据的担忧来自于我必须在域内包含 JPA 实体,这在理论上会违反六边形架构。

所以我想将域实体与 JPA 实体分开。但是如果我这样做,我不知道 Spring Data 的存储库应该去哪里,也不知道如何将 JPA 实体转换为域实体。

为了更好地说明,我假设我需要从我的应用程序连接到数据库以读取用户表。

这可能是域实体:

public class UserDomain{
  private String name;
  ....//More fields, getters, and setters.

根据我的理解,服务应该包括逻辑并操作域实体。

public interface UserService{
  public void create(UserDomain user);
  ...

实现:

public class UserServiceImpl implements UserService{
  public void create(UserDomain user) {
     ... //Calling the repository(Spring Data Repository?)

以上内容以及存储库界面是我认为的域(如果我错了请纠正我)。接下来,基础设施由 JPA 实体组成

@Entity
@Table(name="users")
public class User{
  @Column(name="name")
  private String name;
  ... // More Fields, getters, and setters

我认为我调用 Spring Data 的接口(interface)应该在基础设施部分,因为稍后我需要将 JPA 实体映射到域实体中,也许我需要使用另一个类(和适配器?)来进行映射.这种方法是正确的还是有其他方法?抱歉发了这么长的帖子,我希望我已经说清楚了。

最佳答案

这是一篇关于如何将数据库连接到应用程序的好文章:http://www.dossier-andreas.net/software_architecture/ports_and_adapters.html

您要做的是创建“辅助端口”和“辅助适配器”。

“辅助端口”(= 接口(interface))描述了要做什么,但没有框架依赖性。 “辅助适配器”(= 实现)使用 jpa-repositories。

jpa-entity 不能是您的域。它描述了数据如何存储在数据库中。所以 jpa-entity 不能在“辅助端口”中使用,只能在您的域中使用。

“辅助适配器”需要将您的域转换为 jpa 实体。

不过,如果您真的想使用适当的六边形架构,请小心。 Hibernate 和后来的 JPA 的强大之处在于 jpa-entity 是您的域。它使事情变得更简单(也更难)。通过将您的域与您的实体分开,您将失去延迟加载机会、清晰的事务边界、孤立删除……也许您应该做出权衡并将 jpa 放在核心层中。

希望对你有所帮助

关于java - 带有 spring 数据的六边形架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46509252/

相关文章:

java - 将圈复杂度保持在 5-10 之间是否会使单元测试更容易?

java - Spring Data JPA + Hibernate + Log4j2 创建entityManagerFactory Bean时出现ClassLoadingException

java - Spring data jpa 按嵌套对象集合大小排序

java - 提交jar执行

java - 使用 Proguard (Spring) 混淆后如何避免反射错误

JAVA:创建不干扰同一类其他对象的新对象

java - 使用java构建最小堆

java - thymeleaf : org. thymeleaf .exceptions.TemplateInputException

java - 使用 Spring 数据定位多对多额外关系属性

mysql - Hibernate 创建冗余的多对多表