无法准备语句[列“HIBERNATE_SEQUENCE.NEXTVAL”

问题描述 投票:0回答:1

收到错误 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

为什么会出现这样的错误以及如何修复它?

谢谢

java spring-boot hibernate groovy h2
1个回答
0
投票

有不少错误:

  1. 要创建 LOCALIZED_RESOURCE 表,您必须更改
    key
    列的名称,因为它是关键字,或者将其作为 NON_KEYWORD 添加到驱动程序中 (spring.datasource.url=jdbc:h2:mem:;NON_KEYWORDS=KEY) 。使用后一种方法,您必须告诉 spring boot test 不要替换数据库定义:
    @AutoConfigureTestDatabase(replace = Replace.NONE)
  2. 选择下一个值的正确语法是
    SELECT NEXT VALUE FOR HIBERNATE_SEQUENCE'. Check whether this line 
    spring.jpa.database-platform=org.hibernate.dialect.H2Dialect` 添加到您的 application.properties 会有所帮助。
© www.soinside.com 2019 - 2024. All rights reserved.