2017-08-17 87 views
0

我正在使用SPRING DATA JPA PagingAndSortingRepository對ORACLE表執行CRUD操作。該示例具有自動生成的ID字段。當我執行myrepo.save()時,發佈的值得到保存好,但我注意到Id字段增加了2。例如,jpa pagingandsortingrepository保存正在跳過自動生成的值一個

  1. 我保存和自動根ID結束了64,例如
  2. 我然後做一個第二保存和ID值將具有66
  3. 一個值,那麼我第二次保存並且ID值將具有值68

等等。我嘗試添加分配大小在

@SequenceGenerator(name="seq", initialValue=1, allocationSize=1) 

但這並沒有幫助。我仍然看到id增加2.

保存請求返回一個對象。因此,當我在postman中調試問題時,返回的對象似乎將ID增加1,但DB表中最後顯示的值是郵遞員顯示的值,加上1.

請指教這種奇怪的行爲前面看過。

感謝您的幫助

+0

您將多少個對象保存到數據庫中。看起來您對多個實體使用相同的序列。 – kimy82

+0

你好kimy82;我一次只保存一個對象。 ORACLE表具有爲特定表創建的自己的序列以及映射到該實體的觸發器。 – jscriptor

回答

0

它應該足以將策略放在Id中。如果你沒有設置它的默認值是AUTO和AUTO,那麼它將負責使用一種全局增量策略的數據庫。

@Id 
    @GeneratedValue(strategy= GenerationType.TABLE) 
    private Long id; 

這是的Javadoc:

打開宣言javax.persistence.GenerationType.TABLE

指示持久性提供者必須使用底層數據庫表來分配主鍵爲 實體確保唯一性。

javax.persistence.GenerationType.AUTO

指示持久性提供者應該選擇一個合適 戰略,爲特定的數據庫。 AUTO生成策略可能會要求數據庫資源存在,或者可能會嘗試創建一個。 供應商可能會提供有關如何在運行時不支持模式生成或無法創建 模式資源的情況下創建此類資源的文檔。

希望幫助

1

我相信你所面臨的問題是,SequenceGenerator是全球性的應用程序。如果您在其他實體中使用相同的名稱seq,則也會增加它們。還有其他策略可能更適合處理這個問題。如果這是針對我建議使用的實體的ID @GeneratedValue(strategy=GenerationType.IDENTITY)link提供了有關不同類型的GeneratedValues的更多信息。

+0

我確實認爲這是使用序列時的問題。但是,如果您不想使用,則不必使用序列。 – kimy82

+0

你好;我用.IDENTITY替換了.SEQUENCE,並確保我使用了唯一的已命名的seq名稱。我仍然看到同樣的問題。最奇怪的部分是,在POSTMAN我得到狀態200OK和ID { 「id」:117,但最終在ORACLE表中是118.這是奇怪的 – jscriptor

+0

你可以發佈更多關於你的實體嗎?你如何使用它們? –