簡體   English   中英

為什么 Spring-data-jdbc 不保存我的 Car 對象?

[英]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或原始類型(例如intlong )的值和0的值時,Spring Data JDBC 將實體視為新實體。 如果您的實體具有帶有@Version注釋的屬性,則該屬性將用於確定實例是否是新實例。

為了使其工作,您有以下選項:

  1. 將 id 設置為null並配置您的數據庫模式,以便在插入時自動創建一個新值。 保存后,您的實體實例將包含從數據庫生成的值。

    注意:Spring Data JDBC 將設置 id,即使它在您的實體中是最終的。

  2. 將 id 保留為null並將其在 Before-Convert 偵聽器中設置為所需的值。

  3. 讓您的實體實現Persistable 這使您可以控制何時將實體視為實體。 您可能還需要一個偵聽器,以便讓實體知道它不再是新的。

  4. 從 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM