我打算开始一个新项目来学习 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/