收到错误 hibernateequence notfound 错误,我调试了代码并发现,在保存到存储库时,即使添加必要的注释后,也不会创建 id
这是我的实体类
import groovy.xml.XmlSlurper
import jakarta.persistence.Column
import jakarta.persistence.Entity
import jakarta.persistence.EnumType
import jakarta.persistence.Enumerated
import jakarta.persistence.GeneratedValue
import jakarta.persistence.GenerationType
import jakarta.persistence.Id
import com.lexmark.ccs.domain.license.LicenseType
import com.lexmark.ccs.product.domain.LicenseTechnology
import groovy.xml.slurpersupport.GPathResult
import groovy.xml.XmlUtil
import com.fasterxml.jackson.annotation.JsonIgnore
import jakarta.persistence.SequenceGenerator
import org.springframework.stereotype.Component
import org.xml.sax.SAXException
@Entity(name = 'LICENSE_MODEL_DEFINITION')
@Component
class LicenseModelDefinitionEntity {
@JsonIgnore
@Id
@SequenceGenerator(name = 'HIBERNATE_SEQUENCE', sequenceName = 'HIBERNATE_SEQUENCE')
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = 'HIBERNATE_SEQUENCE')
Long id
@Enumerated(EnumType.STRING)
@Column(nullable = false)
LicenseType type
@Enumerated(EnumType.STRING)
@Column(nullable = false)
LicenseTechnology technology
@Column(nullable = false)
String definitionId
@JsonIgnore
@Column(nullable = false, columnDefinition = 'text')
String definitionXML // XML representation of the model definition.
static LicenseModelDefinitionEntity build(String definitionXML) throws SAXException {
return build(new XmlSlurper().parseText(definitionXML))
}
static LicenseModelDefinitionEntity build(GPathResult node) throws SAXException {
String technology = [email protected]().toUpperCase()
return new LicenseModelDefinitionEntity(
definitionId: [email protected](),
definitionXML: XmlUtil.serialize(node),
technology: LicenseTechnology.valueOf(technology),
type: LicenseType.forName([email protected]()))
}
String toString() {
return "id: $id, type: $type, technology: $technology, definitionId: $definitionId"
}
}
此处保存操作出错
def setup() {
LicenseModelDefinitionEntity factoryNodeLocked = LicenseModelDefinitionEntity.build(LEX_NODE_LOCKED_FACTORY)
LicenseModelDefinitionEntity perpetualNodeLocked = LicenseModelDefinitionEntity.build(LEX_NODE_LOCKED_PERPETUAL)
LicenseModelDefinitionEntity trial = LicenseModelDefinitionEntity.build(LEX_TRIAL)
licenseModelDefinitionRepository.save(factoryNodeLocked)
licenseModelDefinitionRepository.save(perpetualNodeLocked)
licenseModelDefinitionRepository.save(trial)
new File('out/tmp/82M0097/006').deleteDir()
new File('out/tmp/82M9001/001').deleteDir()
}
其中 LEX_NODE_LOCKED_FACTORY 是我们在上面代码中声明的预定义字符串 我调试了代码,发现它在尝试保存到存储库时失败
licenseModelDefinitionRepository.save(factoryNodeLocked)
这条线
factoryNodeLocked 的输出 = id: null,类型:FACTORY,技术:LEX,definitionId:lex.nodelocked.serialNo.factory
期望在尝试保存时创建 id,但不会从这一行抛出错误
这是app.yml,这部分用于从h2数据库进行测试
spring:
main:
allow-circular-references: true
flyway:
enabled: false
config:
activate:
on-profile: development,test
datasource:
url: jdbc:h2:mem:testdb;DB_CLOSE_ON_EXIT=FALSE
username: sa
password:
test-on-borrow: true
validation-query: SELECT 1
driver-class-name: org.h2.Driver
sql:
init:
platform: h2
jpa:
hibernate:
ddl-auto: create-drop
database-platform: org.hibernate.dialect.H2Dialect
My h2 version is 2.2.220 spring version - 3.1.2 gradle version - 7.6.1 groovy version - 4.0.12 jdk 17
这是控制台的错误
2023-09-02T12:09:25.740+05:30 INFO 22081 --- [ Test worker] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
2023-09-02T12:09:25.915+05:30 WARN 22081 --- [ Test worker] o.h.t.s.i.ExceptionHandlerLoggedImpl : GenerationTarget encountered exception accepting command : Error executing DDL "create table LOCALIZED_RESOURCE (id bigint not null, key varchar(255) not null, locale varchar(255) not null, value varchar(255) not null, primary key (id))" via JDBC [Syntax error in SQL statement "create table LOCALIZED_RESOURCE (id bigint not null, [*]key varchar(255) not null, locale varchar(255) not null, value varchar(255) not null, primary key (id))"; expected "identifier";]
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "create table LOCALIZED_RESOURCE (id bigint not null, key varchar(255) not null, locale varchar(255) not null, value varchar(255) not null, primary key (id))" via JDBC [Syntax error in SQL statement "create table LOCALIZED_RESOURCE (id bigint not null, [*]key varchar(255) not null, locale varchar(255) not null, value varchar(255) not null, primary key (id))"; expected "identifier";]
at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:92) ~[hibernate-core-6.2.6.Final.jar:6.2.6.Final]
at org.hibernate.tool.schema.internal.Helper.applySqlString(Helper.java:235) ~[hibernate-core-6.2.6.Final.jar:6.2.6.Final]
at org.hibernate.tool.schema.internal.Helper.applySqlStrings(Helper.java:219) ~[hibernate-core-6.2.6.Final.jar:6.2.6.Final]
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.createTables(SchemaCreatorImpl.java:419) ~[hibernate-core-6.2.6.Final.jar:6.2.6.Final]
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.createSequencesTablesConstraints(SchemaCreatorImpl.java:340) ~[hibernate-core-6.2.6.Final.jar:6.2.6.Final]
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.createFromMetadata(SchemaCreatorImpl.java:239) ~[hibernate-core-6.2.6.Final.jar:6.2.6.Final]
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.performCreation(SchemaCreatorImpl.java:172) ~[hibernate-core-6.2.6.Final.jar:6.2.6.Final]
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:142) ~[hibernate-core-6.2.6.Final.jar:6.2.6.Final]
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:118) ~[hibernate-core-6.2.6.Final.jar:6.2.6.Final]
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:254) ~[hibernate-core-6.2.6.Final.jar:6.2.6.Final]
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.lambda$process$5(SchemaManagementToolCoordinator.java:143) ~[hibernate-core-6.2.6.Final.jar:6.2.6.Final]
at java.base/java.util.HashMap.forEach(HashMap.java:1421) ~[na:na]
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "create table LOCALIZED_RESOURCE (id bigint not null, [*]key varchar(255) not null, locale varchar(255) not null, value varchar(255) not null, primary key (id))"; expected "identifier"; SQL statement:
create table LOCALIZED_RESOURCE (id bigint not null, key varchar(255) not null, locale varchar(255) not null, value varchar(255) not null, primary key (id)) [42001-220]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:514) ~[h2-2.2.220.jar:2.2.220]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) ~[h2-2.2.220.jar:2.2.220]
at org.h2.message.DbException.getSyntaxError(DbException.java:261) ~[h2-2.2.220.jar:2.2.220]
at org.h2.command.Parser.readIdentifier(Parser.java:5764) ~[h2-2.2.220.jar:2.2.220]
at org.h2.command.Parser.parseTableColumnDefinition(Parser.java:9491) ~[h2-2.2.220.jar:2.2.220]
at org.h2.command.Parser.parseCreateTable(Parser.java:9436) ~[h2-2.2.220.jar:2.2.220]
at org.h2.command.Parser.parseCreate(Parser.java:6905) ~[h2-2.2.220.jar:2.2.220]
2023-09-02T12:09:26.061+05:30 WARN 22081 --- [ Test worker] o.h.t.s.i.ExceptionHandlerLoggedImpl : GenerationTarget encountered exception accepting command : Error executing DDL "alter table CATEGORY_localizedResources add constraint FK5upxedtu1el6rg7k1yegl95nx foreign key (localizedResources_id) references LOCALIZED_RESOURCE" via JDBC [Table "LOCALIZED_RESOURCE" not found;]
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "alter table CATEGORY_localizedResources add constraint FK5upxedtu1el6rg7k1yegl95nx foreign key (localizedResources_id) references LOCALIZED_RESOURCE" via JDBC [Table "LOCALIZED_RESOURCE" not found;]
at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:92) ~[hibernate-core-6.2.6.Final.jar:6.2.6.Final]
at org.hibernate.tool.schema.internal.Helper.applySqlString(Helper.java:235) ~[hibernate-core-6.2.6.Final.jar:6.2.6.Final]
at org.hibernate.tool.schema.internal.Helper.applySqlStrings(Helper.java:219) ~[hibernate-core-6.2.6.Final.jar:6.2.6.Final]
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.createForeignKeys(SchemaCreatorImpl.java:303) ~[hibernate-core-6.2.6.Final.jar:6.2.6.Final]
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.createFromMetadata(SchemaCreatorImpl.java:250) ~[hibernate-core-6.2.6.Final.jar:6.2.6.Final]
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.performCreation(SchemaCreatorImpl.java:172) ~[hibernate-core-6.2.6.Final.jar:6.2.6.Final]
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:142) ~[hibernate-core-6.2.6.Final.jar:6.2.6.Final]
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:118) ~[hibernate-core-6.2.6.Final.jar:6.2.6.Final]
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:254) ~[hibernate-core-6.2.6.Final.jar:6.2.6.Final]
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.lambda$process$5(SchemaManagementToolCoordinator.java:143) ~[hibernate-core-6.2.6.Final.jar:6.2.6.Final]
at java.base/java.util.HashMap.forEach(HashMap.java:1421) ~[na:na]
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "LOCALIZED_RESOURCE" not found; SQL statement:
alter table CATEGORY_localizedResources add constraint FK5upxedtu1el6rg7k1yegl95nx foreign key (localizedResources_id) references LOCALIZED_RESOURCE [42102-220]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:514) ~[h2-2.2.220.jar:2.2.220]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) ~[h2-2.2.220.jar:2.2.220]
could not prepare statement [Column "HIBERNATE_SEQUENCE.NEXTVAL" not found; SQL statement:
select HIBERNATE_SEQUENCE.nextval [42122-220]] [select HIBERNATE_SEQUENCE.nextval]; SQL [select HIBERNATE_SEQUENCE.nextval]
org.springframework.dao.InvalidDataAccessResourceUsageException: could not prepare statement [Column "HIBERNATE_SEQUENCE.NEXTVAL" not found; SQL statement:
select HIBERNATE_SEQUENCE.nextval [42122-220]] [select HIBERNATE_SEQUENCE.nextval]; SQL [select HIBERNATE_SEQUENCE.nextval]
at app//org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:256)
at app//org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:229)
at app//org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:550)
at app//org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61)
at app//org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242)
Caused by: org.hibernate.exception.SQLGrammarException: could not prepare statement [Column "HIBERNATE_SEQUENCE.NEXTVAL" not found; SQL statement:
select HIBERNATE_SEQUENCE.nextval [42122-220]] [select HIBERNATE_SEQUENCE.nextval]
at app//org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:64)
at app//org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:56)
at app//org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:108)
at app//org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:187)
at app//org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareStatement(StatementPreparerImpl.java:76)
at app//org.hibernate.id.enhanced.SequenceStructure$1.getNextValue(SequenceStructure.java:100)
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "HIBERNATE_SEQUENCE.NEXTVAL" not found; SQL statement:
select HIBERNATE_SEQUENCE.nextval [42122-220]
at app//org.h2.message.DbException.getJdbcSQLException(DbException.java:514)
at app//org.h2.message.DbException.getJdbcSQLException(DbException.java:489)
at app//org.h2.message.DbException.get(DbException.java:223)
at app//org.h2.message.DbException.get(DbException.java:199)
我尝试添加
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
也尝试过
properties:
hibernate:
id:
new_generator_mappings: true
也尝试过 false
为什么会出现这样的错误以及如何修复它?
谢谢
有不少错误:
key
列的名称,因为它是关键字,或者将其作为 NON_KEYWORD 添加到驱动程序中 (spring.datasource.url=jdbc:h2:mem:;NON_KEYWORDS=KEY) 。使用后一种方法,您必须告诉 spring boot test 不要替换数据库定义:@AutoConfigureTestDatabase(replace = Replace.NONE)
。SELECT NEXT VALUE FOR HIBERNATE_SEQUENCE'. Check whether this line
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect` 添加到您的 application.properties 会有所帮助。