我很难理解仓储模式。
关于这个主题有很多不同的观点,例如在Repository pattern done right中,也有其他观点,比如Repository is the new Singleton,或者像Don't use DAO use Repository,或者使用Spring JPA Data + Hibernate + MySQL + MAVEN,其中仓储似乎与DAO对象相同。
我厌倦了阅读这些文章,因为我认为它不应该是一个像这样被大量文章展示的复杂问题。
我的理解是:我想要的东西似乎是这样的:
------------------------------------------------------------------------
| Server |
------------------------------------------------------------------------
| | | |
Client <-|-> Service Layer <-|-> Repository Layer <-|-> ORM / Database Layer |
| | | |
------------------------------------------------------------------------
服务层接受*DTO对象并将其传递给存储库层,后者基本上就是“那个人”,他知道如何存储实体。例如,假设您有一些工具的组合(请注意,这只是伪代码)。
@Entity
class ToolSet {
@Id
public Long id;
@OneToOne
public Tool tool1;
@OneToOne
public Tool tool2;
}
@Entity
class Tool {
@Id
public Long id;
@OneToMany
public ToolDescription toolDescription;
}
@Entity
class ToolDescription {
@Id
public Long id;
@NotNull
@OneToOne
public Language language
public String name;
public String details;
}
我没有理解的部分是从客户端获取到一个
ToolSetDTO
对象的那一部分。据我目前的理解,我可以编写一个具有方法
ToolSetRepository.save(ToolSetDTO toolSetDto)
的 ToolSetRepository
,它“知道如何存储”一个 ToolSetDTO
。但是几乎每个教程都不会传递 *DTO
而是传递实体 Entity
。让我困扰的是,如果您采用了上面提到的
ToolSet
示例,则需要执行以下步骤:1.取出
toolSetDto
并检查是否非null
2.对于由toolSetDto
拥有的每个tool*Dto
:
a)如果具有有效id,则从DTO
转换为Entity
;否则创建新的数据库条目
b)toolDescriptionDto
进行转换/保存到数据库或创建新条目3.在检查上述项目后创建
ToolSet
(entity) 并设置其以将其持久化到数据库中。所有这些都太复杂了,不能简单地让服务功能(客户端的接口)处理此过程。
我所考虑的是创建一个例如
ToolSetRepository
,但这里的问题是:1.它接受一个
ToolSet
实体对象还是使用一个DTO
对象?
2.无论如何:这个*Repository
是否允许使用其他存储库对象?例如,如果我想保存ToolSet
但必须先存储Tool
和ToolDescription
,那么我会在ToolSetRepository
内部使用ToolRepository
和ToolDescriptionRepository
吗?如果可以的话:为什么不会破坏Repository模式?如果这个模式基本上是服务和我的ORM框架之间的一层,那么由于依赖性的原因,向其他*Repository
类添加依赖关系就不“感觉对了”。我不知道为什么我无法理解这一点。这听起来并不那么复杂,但仍有像Spring Data这样的帮助。另一件困扰我的事情是,我真的看不出这怎么会使任何事情变得更加容易。特别是我已经在使用Hibernate - 我看不到好处(但也许这是另一个问题)。
所以..我知道这是一个很长的问题,但我已经花费了几天的时间进行研究。我正在处理的现有代码已经开始变得混乱,因为我无法看透这个模式。
我希望有人能够给我一个比大多数文章和教程更全面的视角,这些文章和教程只停留在实现一个非常简单的存储库模式示例之上。
ToolSetRepository
如何处理Tool
和ToolDescription
的持久性?或者这些已经被持久化了吗?如果这些在此时应该已经被持久化,那么我应该在哪里做到这一点?在我的服务方法中执行此操作并不合适,因为像ToolSet
这样的复杂实体会使服务方法代码膨胀。在我看来,服务方法只应该进行一些初始化和基本检查工作,然后将工作委托给下一层。 - Stefan Falk