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> {
}
不过,我觉得如果我用春天的数据,JPA的实体将不会是基础设施层的一部分,如果UserRepository是核心层的一部分.这意味着核心实体将毫无用处.我应该创建另一个属于核心层的UserRepository接口还是我缺少的东西?
更新:
我对使用spring数据的关注来自于我必须在域内包含JPA实体,理论上它会违反六边形体系结构.
所以我想将域实体与JPA实体分开.但是,如果我这样做,我不知道Spring Data的存储库应该去哪里,也找到了将JPA实体转换为Domain实体的方法.
为了更好地说明一点,我将假设我需要从我的应用程序连接到数据库以读取用户表.
这可能是域实体:
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的接口应该在基础架构部分,因为稍后我需要将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放入核心层.
我希望你发现这有用
我对你的问题有点困惑。您谈论了很多有关层的知识,而我认为关于六角形体系结构的“文章”使用该术语(几乎是?)专门描述了不该做什么。
Spring Data非常适合六角形方法:实体构成您的核心域,存储库接口构成面向API的数据库。请注意,实现(在核心域之外,主要由Spring Data本身提供)取决于接口,而不是相反。服务和/或Controler构成一个或多个面向用户的API。
六边形体系结构规定了一些违反规则的方法:实体以及存储库上的注释。它们在核心域内,但是通过成为JPA或Spring Data的一部分,取决于数据库访问的使用/实现。
JPA本身进一步违反了六角形体系结构,因为持久性实现的行为可能会大量泄漏到您的域中,因为如果您使用托管实体,则任何更改都会被自动跟踪并最终持久化,而无需调用持久性API。另外,对持久层的更改(例如刷新策略的配置)可能会完全改变API的行为。
| 归档时间: | 
 | 
| 查看次数: | 3281 次 | 
| 最近记录: |