我有XRepository
接口(扩展JpaRepository)。在创建或更新X
实体时,我需要在事务中调用另一个存储库(YRepository
)的方法(确切地说:更新一些字段并在创建/更新的实体X
中使用新值)。
为此,我使用@Transactional
方法和自定义REST控制器创建了一个服务类。控制器上的POST映射工作正常,对我来说是可以接受的,但是如何在我的服务层中以更优雅的方式实现更新(PUT / PATCH)现有实体的问题。它也有效,但必须使用BeanUtils.copyProperties()
。这是一种更好,更传统的方式吗?
public interface XRepository extends JpaRepository<X, Long> {
}
public interface YRepository extends JpaRepository<Y, Long> {
}
@BasePathAwareController
public class XRestControllerCustom {
@Autowired
private MyService myService;
@PostMapping("/x")
public @ResponseBody ResponseEntity<X> create(@RequestBody Resource<X> x) {
return new ResponseEntity<X>(myService.save(x.getContent()), HttpStatus.CREATED);
}
@PatchMapping("/x/{id}")
public @ResponseBody ResponseEntity<X> update(@PathVariable Long id, @RequestBody Resource<X> x) {
myService.update(id, x.getContent());
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
}
@Component
public class MyService {
@Autowired
private XRepository xRepository;
@Autowired
private YRepository yRepository;
@Transactional
public X save(X x) {
yRepository.update();
x.setField(yRepository.get());
return xRepository.save(x);
}
@Transactional
public X update(Long id, X partial) {
X x = xRepository.getOne(id);
BeanUtils.copyProperties(x, partial);
x.setId(id); // because copyProperties makes id null
yRepository.update();
x.setField(yRepository.get());
return xRepository.save(x);
}
}