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