在Spring Data存储库上自定义更新实体

时间:2018-01-15 11:42:24

标签: spring spring-data-jpa spring-data-rest

我有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);     
    }   
}

0 个答案:

没有答案