繁体   English   中英

Spring Data Jpa findOne 方法是否返回托管实体?

[英]Is Spring Data Jpa findOne method return managed entity?

我有一个提供POST请求(文件上传)但实际上提供更新的控制器。 逻辑非常简单: - 通过 id 查找对象 - 如果我们没有这样的对象返回 BAD_REQUEST - 否则更新找到的对象并返回更新为ResponseEntity

@PostMapping("/{id}")
public ResponseEntity<?> post(@PathVariable("id") long id, 
        @RequestParam("file") MultipartFile file) {
    //this is not @Transactional method
    Optional<Job> jobOptional = jobService.getJobById(id);
    return jobOptional
            .map(
                job -> 
                    getSuccessfulResponse(
                        //this is @Transactional
                        jobService.update(job, file))) //1 
            .orElse(
                getBadRequestResponse(
                    getJobNotFoundByIdMessage(id)));

}
[...]
@Service
public class JobService {

    @Transactional
    public Job update(Job job, MultipartFile file) {...}

}

1 时,我们更新检索到的(最终通过CrudRepository#findOne )实体并返回更新并保存到数据库中的值。

我的问题是:我们可以改变方法参数并返回这个改变后的结果,还是我们应该在方法内部创建克隆参数,改变它然后返回结果?

就 jpa/hibernate 而言: CrudRepository#findOne为我们提供了managed/attached实体? 我个人认为 - 不,调用它的方法没有标记@Transactional ,我们可以克隆它,调用CrudRepository#save来提供更新

Spring data-jpa 存储库方法用@Transactional 包装。 为了让您的实体以托管方式传回,您需要使用@Transactional 包装调用存储库方法的公共方法。

从而使交易更上一层楼。

例如

@Transactional
public void makeChanges(Long id) {

   User user = userRepository.findOne(id);
   user.setName("Someone");
}

在交易结束时,您的更改将被保存,因为用户是受管实体。

无论实体是否存在,您都可以更改您的服务以传回 Optional。 例如

@Transactional public Optional<Job> update(Job job, MultipartFile file) {...}

如果实体不存在,则可选为空。 如果实体存在,则可选包含更新后的实体。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM