使用 Hibernate 时使用服务和 DAO 获取 DTO 和实体的最佳实践

Best practice of fetching DTO and entity with Services and DAO when using Hibernate

**1。服务使用:当你看到 hibernate spring 教程时,他们都说对于一个实体(例如我的用户)你必须有一个名为 UserRepository 的存储库,其中包含 find、findAll、delete 等方法。通常 UserRepository扩展了一些基本的 Repository 接口。

然后你必须添加 UserService,它会注入一个 UserRepository。

a。我必须有一个由 UserServiceImpl 实现的 UserService 接口吗?从我的角度来看,拥有它没有任何价值。我可以让 UserService 成为 class 并使用 Spring 使用 GCLIB 而不是 JDKInterfaces 创建代理的能力。

b。通过复制 UserRepository 中的每个方法并委托给 @Autowired 存储库来编写 UserService,然后添加任何其他业务方法是否正确?

c。如果我的 UserService 没有任何业务方法,它只是将所有内容委托给 UserRepository,我可以跳过 UserService 并直接从我的 REST 层访问 UserRepoisitory 吗?

d。假设我还有一个 Address 实体。用户在保存时需要一个地址(这是一个必须的 one2one )。 UserService 是否可以在其中注入 UserRepository 和 AddressRepository,在那里建立关系,然后在每个存储库上调用保存? (不想使用级联持久化,我想知道没有它我该怎么办,因为在某些情况下你不能使用级联)

2. DTO用法:当你想读取数据时,可以直接通过JPQL(或者Criteria,我更喜欢JPQL)来获取实体或者获取DTO。

a。从我的角度来看,我总是会使用 DTO 而不是实体获取。这是因为,我认为 SQL 很简单,如果我必须考虑实体合并、分离、附加等,我会错过 SQL 的整个简单性,并且 ORM 成为敌人性能和复杂性。所以我在读取数据时总是使用DTO,在修改数据时总是使用实体。你怎么看?

b。我想 return 用户实体中的所有列。拥有一个 UserDTo 是否可以,或者我在夸大其词,应该 return 一个用户实体?我对此有 50% - 50%。

c。我想 return 部分来自用户的某些列。在这里,我支持 75% DTO 和 25% 实体。你怎么看?

d。我想 return 用户的某些列和地址的某些列。在这里,我 100% 支持 DTO(尽管我可以加入 fetch Address )。你怎么看?

亲切的问候,

我会一一解答的:

1.a) 是的,确实有道理。服务层是事务边界,它是您通过粗粒度接口向外部世界公开业务逻辑的地方。

1.b) 不,不是。 UserService 定义业务方法,而不是数据访问方法。

1.c) 我仍然会保留服务。

1.d) 当然是。您不需要通过实体名称调用服务。按照他们表达的业务逻辑关注点命名。

2.a) 我的规则很简单:计划修改时的实体和只读投影的 DTO。

2.b) 与 2.a.

相同

2.c) 与 2.a 相同。如果以后需要修改获取的数据,那就用subentities。

2.d) 与 2.a 相同。如果您需要修改数据,请使用实体或子实体。否则,只读投影的 DTO。