存储库模式 - 如何理解它,它如何与“复杂”实体一起工作?
我很难理解存储库模式。
关于这个主题有很多意见,比如在存储库模式中做得对,但其他东西,如存储库是新的单例,或者再次像不使用DAO使用存储库或只是采取Spring JPA Data + Hibernate + MySQL + MAVEN,其中存储库以某种方式看起来与DAO对象相同。
我厌倦了阅读这些东西,因为恕我直言,这不可能是一件困难的事情,因为它在很多文章中都有展示。
我是这样看的:看来我想要的是这样的东西:
------------------------------------------------------------------------
| Server |
------------------------------------------------------------------------
| | | |
Client <-|-> Service Layer <-|-> Repository Layer <-|-> ORM / Database Layer |
| | | |
------------------------------------------------------------------------
获取对象并将这些对象传递给基本上只不过是知道如何存储实体的“家伙”。Service Layer
*DTO
Repository Layer
例如,假设您有一些工具的组合(请注意,这只是伪代码)
@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
ToolSetRepository.save(ToolSetDTO toolSetDto)
ToolSetDTO
*DTO
Entity
这里困扰我的是,如果你从上面举我的例子,我必须做以下步骤:ToolSet
- 如果不是,请采取并检查
toolSetDto
null
- 对于a)拥有的每个
,如果具有有效的ID,则从转换为否则创建新的数据库条目
b)并将其转换/保存到数据库或创建新条目tool*Dto
toolSetDto
DTO
Entity
toolDescriptionDto
- 在检查上述实例(实体)并将其设置为将其持久化到数据库中后
ToolSet
所有这些都太复杂了,不能简单地让服务函数(客户端的接口)来处理这个问题。
我正在考虑的是创建例如a,但这里的问题是ToolSetRepository
- 它是采用实体对象还是使用对象?
ToolSet
DTO
- 无论如何:是否允许使用其他存储库对象?就像当我想保存,但我必须存储,首先 - 我会使用和里面吗?
如果是这样:为什么它不会破坏存储库模式?如果这个模式基本上是服务和我的ORM框架之间的一个层,那么由于依赖性原因,向其他类添加依赖关系是“感觉不对的”。*Repository
ToolSet
Tool
ToolDescription
ToolRepository
ToolDescriptionRepository
ToolSetRepository
*Repository
我不知道为什么我不能解决这个问题。这听起来并不那么复杂,但仍然有帮助,比如.另一件困扰我的事情是,因为我真的不明白这如何使任何事情变得更容易。特别是因为我已经在使用Hibernate - 我没有看到好处(但也许这是另一个问题)。Spring Data
所以。。我知道这是一个很长的问题,但我已经花了几天时间研究它。我现在正在处理的已经存在的代码开始变得一团糟,因为我就是看不透这个模式。
我希望有人能给我一个比大多数文章和教程更大的图景,这些文章和教程除了实现一个非常非常简单的存储库模式示例之外。