六角形结构与弹簧数据

Raf*_*ael 7 java spring hexagonal-architecture spring-data-jpa

我将开始一个新项目来学习弹簧靴,弹簧数据和六边形结构.根据我的理解,六边形体系结构旨在将核心或域层与数据库操作(Infrastructure Layer)分开.我已经看到了这个架构的以下项目结构.

核心层有:

服务 - >逻辑走向(接口及其实现).

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

存储库 - >基础结构层必须实现的接口.

Infrastructure Layer具有Repository接口,JPA实体,对数据库的调用(hibernate)以及将JPA实体转换为Core Entities(mappers?)的某种函数的实现.

Spring数据有一种非常有用的方法来实现CRUD操作:

public interface UserRepository extends JpaRepository<User, Integer> {
}
Run Code Online (Sandbox Code Playgroud)

不过,我觉得如果我用春天的数据,JPA的实体将不会是基础设施层的一部分,如果UserRepository是核心层的一部分.这意味着核心实体将毫无用处.我应该创建另一个属于核心层的UserRepository接口还是我缺少的东西?

更新:

我对使用spring数据的关注来自于我必须在域内包含JPA实体,理论上它会违反六边形体系结构.

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

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

这可能是域实体:

public class UserDomain{
  private String name;
  ....//More fields, getters, and setters.
Run Code Online (Sandbox Code Playgroud)

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

public interface UserService{
  public void create(UserDomain user);
  ...
Run Code Online (Sandbox Code Playgroud)

实施:

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

以上与存储库接口是我认为的域(如果我错了请纠正我).接下来,基础架构由JPA实体组成

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

我认为我称之为Spring Data的接口应该在基础架构部分,因为稍后我需要将JPA实体映射到Domain实体中,也许我需要使用另一个类(和适配器?)来进行映射.这种方法是正确的还是有其他方法吗?对不起,很长的帖子,我希望我已经说清楚了.

Tom*_*som 13

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

您要做的是创建" 辅助端口 "和" 辅助适配器 ".

"辅助端口"(= interface)描述了要执行的操作,但没有框架依赖性.'secondary adapter'(= implementation)使用jpa-repositories.

jpa-entity不能成为您的域名.它描述了数据如何存储在数据库中.因此,jpa-entity不能用于"辅助端口",只能用于您的域.

"辅助适配器"需要将您的域转换为jpa实体.

但是,如果你真的想要使用正确的六边形结构,请小心.Hibernate和后来的JPA的强大之处在于jpa-entity是你的域名.它使事情变得更简单(也更难).通过从您的实体中分割您的域,您将失去延迟加载机会,清除事务边界,孤立删除,...也许您应该进行交易并将jpa放入核心层.

我希望你发现这有用


Jen*_*der 5

我对你的问题有点困惑。您谈论了很多有关层的知识,而我认为关于六角形体系结构的“文章”使用该术语(几乎是?)专门描述了不该做什么。

Spring Data非常适合六角形方法:实体构成您的核心域,存储库接口构成面向API的数据库。请注意,实现(在核心域之外,主要由Spring Data本身提供)取决于接口,而不是相反。服务和/或Controler构成一个或多个面向用户的API。

六边形体系结构规定了一些违反规则的方法:实体以及存储库上的注释。它们在核心域内,但是通过成为JPA或Spring Data的一部分,取决于数据库访问的使用/实现。

JPA本身进一步违反了六角形体系结构,因为持久性实现的行为可能会大量泄漏到您的域中,因为如果您使用托管实体,则任何更改都会被自动跟踪并最终持久化,而无需调用持久性API。另外,对持久层的更改(例如刷新策略的配置)可能会完全改变API的行为。