[英]How to save data immediately to the database using Spring Boot and JPA Repository
[英]Spring JPA Repository save not Inserting into the database
我正在啟動一個包含@Service
類的 spring-boot 應用程序:
@Service
@Transactional (value = MatrixModelConfiguration.TRANSACTION_MANAGER_MATRIX)
public class MatrixTubeService implements IMatrixTubeService {
@Autowired
MatrixTubeRepository repository;
@Override
public void flush() {
boolean txn = TransactionSynchronizationManager.isActualTransactionActive();
System.out.println("flush txn exist " + txn);
repository.flush();
}
@Override
public MatrixTube save(MatrixTube matrixTube) {
boolean txn = TransactionSynchronizationManager.isActualTransactionActive();
String txnName = TransactionSynchronizationManager.getCurrentTransactionName();
System.out.println("save txn exist " + txn + " as " + txnName);
return repository.save(matrixTube);
}
.
.
.
包裝對這個簡單的@EnableJpaRepositories
類的調用:
@EnableJpaRepositories(entityManagerFactoryRef = MatrixModelConfiguration.ENTITY_MANAGER_FACTORY_MATRIX,
transactionManagerRef = MatrixModelConfiguration.TRANSACTION_MANAGER_MATRIX)
public interface MatrixTubeRepository extends JpaRepository<MatrixTube, Long> {
}
此代碼位於一個依賴 jar 中,並且在三個父項目中的兩個中完美運行。 如果不是,則 INSERT/UPDATE 不適用於數據庫。 事實上,它們甚至沒有顯示在調試輸出中。
Exception
JpaRepository
實現都按預期工作我在新創建的對象的service.save()
之后直接添加了對service.flush()
的調用,並在幾次更新之前讀取的對象(在同一個 txn 內)之后再次添加了對service.flush()
的調用,在這兩種情況下,我都看到 txn 處於活動狀態在flush方法中,但是當repository.flush()
被調用時,我得到一個“沒有正在進行的事務”異常。
我錯過了什么?
也許 spring-test 設置回滾默認值是 true,
添加@Rollback(false)
解決了我的問題。
使用 springdatajpa,您不需要所有這些魔法。 txn 等
在您的主應用程序類中使用此注釋。
@EnableJpaRepositories(entityManagerFactoryRef = MatrixModelConfiguration.ENTITY_MANAGER_FACTORY_MATRIX,
transactionManagerRef = MatrixModelConfiguration.TRANSACTION_MANAGER_MATRIX)
從本教程開始。 與標准 Hibernate/jpa 相比,Spring 數據 jpa 有點神奇。
問題與從事務內部產生一個新線程有關,該線程實際上在事務提交后(在計算機時間)執行 SQL 插入。
不知道為什么沒有拋出異常,但是將插入返回事務線程修復了所有問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.