在 Java Spring 教程之后,我試圖了解 @Transactional 如何與 setter 一起作業,并且從其他問題/來源中,我找不到適合初學者的解釋。
假設我有一個帶有 getter 和 setter 的用戶物體:
@Entity
@Table
public class User {
// Sequence set up
private Long id;
private String name;
private String email;
private String password;
// Other constructors, setters and getters
public void setName(String name) {
this.name = name;
}
}
在 UserService 我有一個 getUserName 方法:
@Service
public class UserService {
private final UserRepository userRepository;
@Autowired
public StudentService(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Transactional
public Boolean getName(Long id) {
User user = userRepository
.findById(id)
.orElseThrow(
() -> new IllegalStateException("Invalid id"));
user.setName("new user name"); // Why will this update db?
return true;
}
}
來自 javascript ORM,我們通常像這樣更新資料:userRepository.update(). 使用@Transactional注解,setter函式確實更新db,這是更新資料的spring方式嗎?有人可以用外行術語幫助解釋事務如何在幕后與設定器一起作業嗎?
編輯:沒有@Transactional,setter 函式不會更新 db,但為了改變 db,必須呼叫userRepository.save(user). 從視頻中,講師簡單地說 Transactional 將為我們處理 jpql,并與它一起使用 setter 來更新 db。
uj5u.com熱心網友回復:
首先,它是底層的 JPA 提供者(假設它是 Hibernate)負責更新物體,而不是 Spring。Spring 只是提供與 Hibernate 的集成支持。
要更新從 DB 加載的物體,通常需要確保按順序執行以下操作。
開始資料庫事務
用于
EntityManager加載您要更新的物體。加載的物體據說由 this 管理,EntityManager這樣它將跟蹤對其狀態所做的所有更改,并生成必要的更新 SQL 以自動更新 (4) 中的此物體.對物體的狀態進行一些更改。您可以通過任何方式來完成它,例如呼叫它的任何方法,而不僅限于通過 setter 呼叫它
沖洗
EntityManager. 然后它將生成更新 SQL 并發送到資料庫。提交資料庫事務
另請注意以下事項:
- Spring 提供
@Transactional了一種通過將其注釋到方法來執行 (1) 和 (5) 的宣告性方式。 - 默認情況下,Hibernate 會在執行 (5) 之前自動呼叫 (4),這樣您就不需要顯式呼叫 (4)。
- Spring Data JPA 存盤庫
EntityManager在內部用于加載用戶。因此從存盤庫回傳的用戶將由該 EntityManager 管理。
所以簡而言之,@Transactional更新物體是必要的。并且更新物體與 setter 無關,因為它只關心最終物體是否有狀態更改,并且您可以在不使用 setter 的情況下進行操作。
uj5u.com熱心網友回復:
Spring 在底層使用 Hibernate 作為 ORM。當您呼叫時userRepository.findById,Hibernate 物體管理器在后臺被呼叫,它從資料庫中檢索物體并同時進行此操作entity manageable(您可以單獨閱讀有關 Hibernate 托管物體的資訊)。這意味著什么,簡而言之,Hibernate 在其內部結構中“記住”對該物體的參考,即所謂的session. 實際上,它“記住”它在單個事務期間(在非常基本的情況下)從資料庫中檢索到的所有物體(甚至是通過查詢獲得的物體串列)。
當你做一些方法@Transactional時,默認情況下休眠session是flushed在這種方法完成的時候。session.flush()在引擎蓋下被稱為。
一次session gets flushed,Hibernate 會將對這些所做的所有更改推managed entities回資料庫。
這就是為什么一旦方法完成,您的更改就會進入資料庫,而無需任何額外的呼叫。
要深入了解該主題,您可以閱讀更多關于Hibernate managed entities, session flush mode, repository.save(), repository.saveAndFlush() in Spring Data.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/462567.html
上一篇:java物件的ID與資料庫不同步
