【发布时间】:2019-01-29 07:15:24
【问题描述】:
我制作了一个使用 JPA 和 Spring 的系统。例如,如果我需要处理 Accounts,我使用存储库:
@Repository
public interface AccountRepository extends JpaRepository<Account, Long>
然后我创建一个使用存储库的服务:
class AccountServiceImpl implements AccountService {
@Autowired
private AccountRepository repository;
@Transactional
public Account save(Account account){
return repository.save(account);
}
...
现在,我创建了一个控制器来处理 Accounts 的 POST 方法:
@Controller
public class AccountController {
@Autowired
private final accountService service;
@RequestMapping(value = "/account", method = RequestMethod.POST)
public ModelAndView account(@Valid Account account, BindingResult bindingResult) {
...
service.save(account);
客户、产品、联系人等也是如此。
现在,假设我还有一个名为“registration”的类,它包含足够的数据来创建一个客户,包括他的帐户、联系数据和产品(大量数据)。对注册的“确认”操作是专门用于执行此操作的操作:
@RequestMapping(value = "/confirm", method = RequestMethod.POST)
public ModelAndView confirmRegistration(@Valid Registration registration, BindingResult bindingResult) {
现在我的问题是:为每个存储库调用 save 方法的正确方法是什么?
1) 我是否应该在 controller 中创建类,然后为创建的每个类调用 save 方法:
@RequestMapping(value = "/confirm", method = RequestMethod.POST)
public ModelAndView confirmRegistration(@Valid Registration registration, BindingResult bindingResult) {
...
customerService.save(customer);
accountService.save(account);
contactDataService.save(contactData);
productService.save(contactData);
...
2) 在RegistrationService中调用每个服务的saves:
class RegistrationServiceImpl implements RegistrationService {
@Autowired
private AccountService accountService;
@Autowired
private CustomerService customerService;
....
@Transactional
public void confirm(Registration registration){
... here I create the object
customerService.save(customer);
accountService.save(account);
}
3) 在RegistrationService中调用每个repository的saves:
class RegistrationServiceImpl implements RegistrationService {
@Autowired
private AccountRepository accountRepository;
@Autowired
private CustomerRepository customerRepository;
....
@Transactional
public void confirm(Registration registration){
... here I create the object
customerRepository.save(customer);
accountRepository.save(account);
}
我知道是否必须使用 (1)。但对选项(2)和(3)感到困惑。
问题又来了:
应该/我可以在服务中使用其他服务吗?或者我只能在服务中使用存储库?
谷歌解释这个的正确方法是什么?抱歉,英语不是我的母语,我找不到正确的方式来询问这种设计。
【问题讨论】:
-
考虑事务分界也许是一个起点。服务处理存储库的事务。
-
谷歌搜索建议:spring 采用了领域驱动设计的术语,您可以谷歌领域驱动设计或 DDD 以及服务或存储库等术语以获得更多概念性解释。
标签: java spring jpa spring-data-jpa