我很难理解存储库模式。
关于该主题有很多意见,例如在Repository模式中做得正确,但其他信息,例如Repository是新的Singleton或再次出现,例如在不要使用DAO中使用Repository或只是以某种方式使用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)
“知道如何存储” a的方法编写一个ToolSetDTO
。但是几乎每个教程都没有通过,*DTO
而是通过了Entity
。
让我困扰的是,如果您ToolSet
从上面举我的例子,我将必须执行以下步骤:
- 采取
toolSetDto
并检查是否null
- 对于每个
tool*Dto
拥有者toolSetDto
a)如果具有有效的id,则从转换为DTO
,Entity
否则创建一个新的数据库条目
b)toolDescriptionDto
并将其转换/保存到数据库或创建一个新条目 - 在检查
ToolSet
完上述实例(实体)并将其设置为持久保存在数据库中之后
所有这些都太复杂了,以至于不能简单地让服务功能(客户端的接口)来处理。
我当时在想创建一个,ToolSetRepository
但是这里的问题是
- 它采用
ToolSet
实体对象还是使用DTO
对象? - 无论如何:
*Repository
允许使用其他存储库对象吗?就像当我要救ToolSet
,但我必须存储Tool
和ToolDescription
第一-我会用ToolRepository
和ToolDescriptionRepository
里面ToolSetRepository
?
如果是这样:为什么它不破坏存储库模式?如果此模式基本上是服务和我的ORM框架之间的层,则*Repository
由于依赖关系的原因,它只是“感觉不到”将依赖关系添加到其他类。
我不知道为什么我无法解决这个问题。这听起来并不认为复杂,但还是有帮助有像Spring Data
。另一件事困扰着我,因为我真的不知道这如何使事情变得容易。特别是因为我已经在使用Hibernate-我看不到好处(但这也许是另一个问题)。
所以..我知道这是一个很长的问题,但是我已经花了几天的研究时间。我现在正在使用的现有代码已经变得一团糟,因为我看不到这种模式。
我希望有人能给我比大多数文章和教程更大的印象,而这些文章和教程只能实现一个非常非常简单的存储库模式示例。