[英]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.