带弹簧数据的六边形结构
我将开始一个新项目来学习弹簧靴,弹簧数据和六边形架构。根据我的理解,六边形架构旨在将核心层或域层与数据库操作(基础架构层)分开。我已经看到了此体系结构的以下项目结构。
核心层具有:
服务>逻辑的去向(接口及其实现)。
实体 -> 这些将在整个应用程序中使用。
基础结构层必须实现的存储库>接口。
基础设施层具有存储库接口,JPA实体,对数据库的调用(休眠)以及某种将JPA实体转换为核心实体(映射器?)的函数的实现。
Spring数据有一个非常有用的方法来实现CRUD操作:
public interface UserRepository extends JpaRepository<User, Integer> {
}
但是,我认为如果我使用 spring 数据,如果 UserRepository 是核心层的一部分,则 JPA 实体将不会成为基础架构层的一部分。这意味着核心实体将毫无用处。我应该创建另一个属于核心层的用户存储库界面,还是缺少某些内容?
更新:
我对 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的接口应该在基础架构部分,因为稍后我需要将JPA实体映射到域实体中,也许我需要使用另一个类(和适配器?)来执行该映射。这种方法是否正确还是有其他方法?很抱歉这篇文章很长,我希望我已经把自己说清楚了。