Java jpa pagingandsortingrepository save将自动生成的值跳过1
我使用SpringDataJPAPagingandSortingRepository对ORACLE表执行CRUD操作。该示例有一个自动生成的ID字段。当我执行myrepo.save()时,发布的值被保存为ok,但我注意到Id字段增加了2。比如说,Java jpa pagingandsortingrepository save将自动生成的值跳过1,java,spring,spring-data-jpa,Java,Spring,Spring Data Jpa,我使用SpringDataJPAPagingandSortingRepository对ORACLE表执行CRUD操作。该示例有一个自动生成的ID字段。当我执行myrepo.save()时,发布的值被保存为ok,但我注意到Id字段增加了2。比如说, 例如,我进行了一次保存,自动生成id最终为64 然后我进行第二次保存,ID值将为66 然后我进行第二次保存,ID值将为68 等等。我尝试添加分配,如中所示 @SequenceGenerator(name="seq", initialValue=1, a
@SequenceGenerator(name="seq", initialValue=1, allocationSize=1)
但这没有帮助。我仍然看到id增加了2
保存请求返回一个对象。因此,当我调试postman中的问题时,返回的对象的Id似乎增加了1,但在DB表中结束的是postman显示的值加上1
请告知以前是否见过这种奇怪的行为
感谢您的帮助将策略放置在Id中就足够了。如果您没有将其设置为“自动”,则默认为“自动”,并且“自动”将向使用某种全局增量策略的数据库负责
@Id
@GeneratedValue(strategy= GenerationType.TABLE)
private Long id;
这是javadoc:
打开声明javax.persistence.GenerationType.TABLE
指示持久性提供程序必须为其分配主键
使用基础数据库表以确保唯一性的实体
javax.persistence.GenerationType.AUTO
指示持久性提供程序应选择适当的
特定数据库的策略。自动生成策略可能会
期望数据库资源存在,或者它可能尝试创建一个数据库资源。
供应商可以提供有关如何在中创建此类资源的文档
不支持架构生成或无法创建的事件
运行时的架构资源
希望对您有所帮助。将策略放置在Id中就足够了。如果您没有将其设置为“自动”,则默认设置为“自动”,并且“自动”将赋予使用某种全局增量策略的数据库责任
@Id
@GeneratedValue(strategy= GenerationType.TABLE)
private Long id;
这是javadoc:
打开声明javax.persistence.GenerationType.TABLE
指示持久性提供程序必须为其分配主键
使用基础数据库表以确保唯一性的实体
javax.persistence.GenerationType.AUTO
指示持久性提供程序应选择适当的
特定数据库的策略。自动生成策略可能会
期望数据库资源存在,或者它可能尝试创建一个数据库资源。
供应商可以提供有关如何在中创建此类资源的文档
不支持架构生成或无法创建的事件
运行时的架构资源
希望这会有所帮助我相信您面临的问题是SequenceGenerator对于应用程序来说是全局的。如果您在其他实体中使用相同名称的
seq
,您也将增加它们。还有其他一些策略可能更适合处理这一问题。如果这是一个实体的ID,我建议使用@GeneratedValue(strategy=GenerationType.IDENTITY)
这提供了关于不同类型GeneratedValue的更多信息。我相信您面临的问题是SequenceGenerator对于应用程序来说是全局的。如果您在其他实体中使用相同名称的seq
,您也将增加它们。还有其他一些策略可能更适合处理这一问题。如果这是一个实体的ID,我建议使用@GeneratedValue(strategy=GenerationType.IDENTITY)
这提供了关于不同类型GeneratedValue的更多信息。您要将多少对象保存到数据库中。看起来您正在对多个实体使用相同的序列;我一次保存一个对象。ORACLE表有自己的序列,该序列随该特定表的触发器一起创建,并映射到此实体。要将多少对象保存到数据库中。看起来您正在对多个实体使用相同的序列;我一次保存一个对象。ORACLE表有它自己的序列,并为该特定表创建了一个触发器,该触发器映射到这个实体。我同意这是使用序列时的问题。但是,如果不想使用序列,则不必使用序列;我将.SEQUENCE替换为.IDENTITY,并确保使用的是唯一的命名为seq的名称。我仍然看到同样的问题。最奇怪的是,在《邮差》中,我的状态是200OK和id{“id”:117但ORACLE表中最后显示的是118。这很奇怪。您可以发布更多关于您的实体的信息吗?以及您如何使用它们?我同意这是使用sequence时的问题。但是,如果您不想使用sequence,则不必使用sequence。您好;我将.sequence替换为.IDENTITY,并确保我使用的是unique命名的seq名称。我仍然看到相同的问题。最奇怪的是,在《邮递员》中,我得到状态200OK和id{“id”:117,但ORACLE表中的结果是118。这很奇怪。你能发布更多关于你的实体的信息吗?以及你是如何使用它们的?