[英]Why does Spring-data-jdbc not save my Car object?
我正在玩 spring-data-jdbc 並發現了一個問題,我無法使用 Google 解決。
無論我嘗試做什么,我都無法將微不足道的對象推送到數據庫中(Bean1.java:25): carRepository.save(new Car(2L, "BMW", "5"));
兩者,沒有一個和一個 TransactionManager + @Transactional
數據庫(顯然)不會提交記錄。
該代碼基於 Postgres 數據庫,但您也可以簡單地使用下面的 H2 並獲得相同的結果。
這是(簡約的)源代碼: https ://github.com/bitmagier/spring-data-jdbc-sandbox/tree/stackoverflow-question
誰能告訴我,為什么汽車沒有插入數據庫?
這與不工作的事務無關。 相反,它是關於 Spring Data JDBC 考慮您的實例是需要更新(而不是插入)的現有實例。
您可以通過激活org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate
的日志記錄來驗證這是問題所在。 您應該會看到update
但沒有insert
。
默認情況下,當一個實體具有對象類型的 id 和null
或原始類型(例如int
或long
)的值和0
的值時,Spring Data JDBC 將實體視為新實體。 如果您的實體具有帶有@Version
注釋的屬性,則該屬性將用於確定實例是否是新實例。
為了使其工作,您有以下選項:
將 id 設置為null
並配置您的數據庫模式,以便在插入時自動創建一個新值。 保存后,您的實體實例將包含從數據庫生成的值。
注意:Spring Data JDBC 將設置 id,即使它在您的實體中是最終的。
將 id 保留為null
並將其在 Before-Convert 偵聽器中設置為所需的值。
讓您的實體實現Persistable
。 這使您可以控制何時將實體視為新實體。 您可能還需要一個偵聽器,以便讓實體知道它不再是新的。
從 Spring Data JDBC 1.1 版開始,您還可以使用JdbcAggregateTemplate
進行直接插入,而無需檢查 id,請參閱https://jira.spring.io/browse/DATAJDBC-282
。 當然,您可以在存儲庫的自定義方法中執行此操作,如本示例中所做的那樣: https ://github.com/spring-projects/spring-data-examples/pull/441
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.