簡體   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