Spring Boot 为什么Oracle数据库中的ID值不是用IDENTITY自动生成的?

n53p2ov0  于 12个月前  发布在  Spring
关注(0)|答案(1)|浏览(204)

我工作的一家公司的SpringBoot项目中使用了Oracle数据库,项目运行时没有问题,但是当save()命令运行时,它会给出一个错误,因为它无法生成带有@GeneratedValue(strategy = GenerationType.IDENTITY)注解的ID值。
我们正在Intellij IDEA应用程序中开发该项目,我使用Oracle数据库,并从BitBucket网站获得项目代码。
问题是,虽然所有的东西都是一样的,iIndiee. Java,Maven,SpringBoot,Hibernate,OJDBC和代码,为什么我的电脑有这个问题,而我的其他朋友没有这个问题。
Spring版本:2.4.1
Java版本号:jdk1.8.0_202
Maven版本:apache-maven-3.6.3
Oracle版本:12 c
休眠版本:
x1c 0d1x的数据
OJDBC版本:OJDBC 8
这些版本与我的同事的版本相同,没有任何差异,但在我的计算机上,Oracle数据库的@GeneratedValue(strategy = GenerationType.IDENTITY)注解不起作用。
但不是
@GeneratedValue(strategy = GenerationType.IDENTITY)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ODF_SMS_NTF_SEQ")
当我写
@SequenceGenerator(name = "ODF_SMS_NTF_SEQ", sequenceName = "ODF_SMS_NTF_SEQ", allocationSize = 1)
但在我队友的项目中
@GeneratedValue(strategy = GenerationType.IDENTITY)
工程.
项目或数据库授权没有问题,因为SEQUENCE正常工作,而IDENTITY不正常工作
休眠状态:

insert into odf_sms_ntf (sms_ntf_id, cdate, cuser, bsn_inter_spec_id, cust_id, data_tp_id, dealers_code, edate, is_verified, ref_code, row_id, sdate, sms_val, tel_num, try_count, user_id) values (default, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

字符串
错误消息:

2023-11-17 03:16:51.889  WARN IN0001026270162 --- [nio-8080-exec-6] o.h.e.j.s.SqlExceptionHelper             : SQL Error: 17068, SQLState: 99999
2023-11-17 03:16:51.889 ERROR IN0001026270162 --- [nio-8080-exec-6] o.h.e.j.s.SqlExceptionHelper             : Çağrıda geçersiz bağımsız değişkenler var
2023-11-17 03:16:51.891 ERROR IN0001026270162 --- [nio-8080-exec-6] o.h.AssertionFailure                     : HHH000099: an assertion failure occurred (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session): org.hibernate.AssertionFailure: null id in etiya.commerce.backend.odf.common.entity.security.OdfSmsNtfEntity entry (don't flush the Session after an exception occurs)
2023-11-17 03:16:51.904  INFO IN0001026270162 --- [nio-8080-exec-6] e.c.b.c.w.DceProfiler                    : execution-time-error: 26099 ms -`http://localhost:8080/odf/security/verification/sendSms` - etiya.commerce.backend.odf.controller.rest.security.OdfSecurityVerificationController.sendSms
2023-11-17 03:16:51.905 ERROR IN0001026270162 --- [nio-8080-exec-6] .c.b.o.c.w.OdfCustomRestExceptionHandler : error id : 1700209011905 - url: `http://localhost:8080/odf/security/verification/sendSms`
org.hibernate.AssertionFailure: null id in etiya.commerce.backend.odf.common.entity.security.OdfSmsNtfEntity entry (don't flush the Session after an exception occurs)
    at org.hibernate.event.internal.DefaultFlushEntityEventListener.checkId(DefaultFlushEntityEventListener.java:78)
    at org.hibernate.event.internal.DefaultFlushEntityEventListener.getValues(DefaultFlushEntityEventListener.java:204)
    at org.hibernate.event.internal.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:164)
    at org.hibernate.event.internal.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:232)
    at org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:92)
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)
    at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:102)
    at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1362)
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1349)
    at org.hibernate.query.internal.NativeQueryImpl.beforeQuery(NativeQueryImpl.java:267)
    at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1591)
    at org.hibernate.query.internal.AbstractProducedQuery.getSingleResult(AbstractProducedQuery.java:1641)
    at org.springframework.data.jpa.repository.query.JpaQueryExecution$SingleEntityExecution.doExecute(JpaQueryExecution.java:1


虽然我的项目和所需的Java、Maven、Ojdbc等文件和我的其他队友是一样的,但是@GeneratedValue(strategy = GenerationType.IDENTITY)的注解在我的其他队友的电脑上可以生成一个id的值,但是为什么在我的项目中不能用IDENTITY生成一个id的值,我正在调查这是什么原因。

disho6za

disho6za1#

设置GenerationType.IDENTITY意味着数据库将递增id的值。它适用于MySQL等其他数据库,但不适用于Oracle数据库。您应该使用序列来递增id或使用触发器。
但是,如果你有Oracle 12c或更高版本,那么你可以手动创建一个表,而不需要自动生成数据表。
举例来说:
这是一个带有自动生成主键的表:

CREATE TABLE MY_TABLE (
  ID NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY
);

字符串
另外,请确保将Oracle12cDialect属性值设置为Hibernate配置。

相关问题