** 1。服务使用情况:当你看到一个hibernate spring教程时,他们都说对于一个实体(比如我的情况下的用户),你必须有一个名为UserRepository的仓库,其中包含find,findAll,delete等方法。通常,UserRepository扩展了一些基本仓库接口。使用Hibernate时获取DTO和实体与服务和DAO的最佳实践
然后你必须添加UserService,它注入一个UserRepository。
a。我必须有一个由UserServiceImpl实现的UserService接口吗?从我的角度来看,它没有增加任何价值。我可以让UserService成为一个类,并使用Spring的能力来使用GCLIB而不是JDKInterfaces来创建代理。
b。通过复制UserRepository中的每个方法并委派给@Autowired存储库,然后添加任何其他商业方法来编写UserService是否正确?
c。如果我的UserService没有任何商业方法,它只是委托一切到UserRepository,我可以跳过UserService并直接从REST层访问UserRepoisitory?
d。假设我也有一个Address实体。用户在保存时需要一个地址(这是一个强制性的)。 UserService是否可以将UserRepository和AddressRepository注入其中,在那里建立关系,然后在每个存储库上调用save? (不想使用级联坚持,我想知道我怎么会没有它,因为在某些情况下,你不能使用级联)
2. DTO用法:当你想读取数据,你可以取实体或通过JPQL直接获取DTO(或Criteria,我更喜欢JPQL)。
a。从我的角度来看,我总是使用DTO而不是实体抓取。这是因为,我认为SQL很简单,如果我必须考虑实体合并,分离,附加等,我错过了SQL的整个简单性,并且ORM在性能和复杂性方面成为敌人。因此,当我修改数据时,我总是在读取数据和实体时使用DTO。你怎么看?
b。我想返回用户实体的所有列。有没有UserDTo可以,或者我夸大,应该只是返回一个用户实体?我有50% - 50%。
c。我想部分返回来自用户的一些列。在这里,我是75%的DTO和25%的实体。你怎么看?
d。我想返回一些用户列和地址列。在这里,我是DTO的100%(尽管我可以加入获取地址)。你怎么看?
亲切的问候,
很好的答案!我想为2a的规则添加一个例外。有时候你的属性不能从服务层以外的地方修改, G。像更新时间戳属性。在这种情况下,您应该使用具有可更新属性的DTO。有时候你会有另一组创建属性。然后,你甚至应该使用另一种类型的DTO进行创建。 – Javatar81
是的。服务层负责仅返回允许修改的子实例版本,因此隐藏不应更新的属性。 –