我工作的一家公司的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
的值,我正在调查这是什么原因。
1条答案
按热度按时间disho6za1#
设置
GenerationType.IDENTITY
意味着数据库将递增id
的值。它适用于MySQL等其他数据库,但不适用于Oracle数据库。您应该使用序列来递增id
或使用触发器。但是,如果你有Oracle 12c或更高版本,那么你可以手动创建一个表,而不需要自动生成数据表。
举例来说:
这是一个带有自动生成主键的表:
字符串
另外,请确保将
Oracle12cDialect
属性值设置为Hibernate配置。