代码之家  ›  专栏  ›  技术社区  ›  Thierry

从Hibernate5.2迁移到5.3时,hibernate尝试使用一个奇怪的序列

  •  1
  • Thierry  · 技术社区  · 6 年前

    Caused by: org.h2.jdbc.JdbcSQLException: Schéma "ENHANCED" non trouvé
    Schema "ENHANCED" not found; SQL statement:
    call next value for enhanced.SequenceStyleGenerator [90079-197]
        at org.h2.engine.SessionRemote.done(SessionRemote.java:623) ~[h2-1.4.197.jar:1.4.197]
        at org.h2.command.CommandRemote.prepare(CommandRemote.java:85) ~[h2-1.4.197.jar:1.4.197]
        at org.h2.command.CommandRemote.<init>(CommandRemote.java:51) ~[h2-1.4.197.jar:1.4.197]
        at org.h2.engine.SessionRemote.prepareCommand(SessionRemote.java:493) ~[h2-1.4.197.jar:1.4.197]
        at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1247) ~[h2-1.4.197.jar:1.4.197]
        at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:76) ~[h2-1.4.197.jar:1.4.197]
        at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:304) ~[h2-1.4.197.jar:1.4.197]
        at com.mchange.v2.c3p0.impl.NewProxyConnection.prepareStatement(NewProxyConnection.java:567) ~[c3p0-0.9.5.2.jar:0.9.5.2]
        at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$1.doPrepare(StatementPreparerImpl.java:87) ~[hibernate-core-5.3.6.Final.jar:5.3.6.Final]
        at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:172) ~[hibernate-core-5.3.6.Final.jar:5.3.6.Final]
    

    id字段的注释方式如下:

    @Id
    @GeneratedValue(generator = "enhanced.SequenceStyleGenerator")
    @GenericGenerator(
        name = "enhanced.SequenceStyleGenerator", 
        parameters = {
                // this value needs to be used when creating the sequence in "increment-by" clause.
                @Parameter(name = "increment_size", value= "10"),
                // default name : hibernate_sequence
                @Parameter(name = "prefer_sequence_per_entity", value= "false"),
                @Parameter(name = "optimizer", value="pooled")
        },
        strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator")
    @Column(name = "ID", nullable = false)
    private Long id;
    

    迁移指南如下: https://github.com/hibernate/hibernate-orm/blob/5.3/migration-guide.adoc 不要引用序列发生器上的任何更改。

    有什么问题吗?

    2 回复  |  直到 6 年前
        1
  •  4
  •   Thierry    6 年前

    我发现这是hibernate 5.3的一个新行为:

    SequenceStyleGenerator.determineSequenceName

    final Boolean preferGeneratorNameAsDefaultName = serviceRegistry.getService( ConfigurationService.class )
                .getSetting( AvailableSettings.PREFER_GENERATOR_NAME_AS_DEFAULT_SEQUENCE_NAME, StandardConverters.BOOLEAN, true );
    if ( preferGeneratorNameAsDefaultName ) {
        final String generatorName = params.getProperty( IdentifierGenerator.GENERATOR_NAME );
        if ( StringHelper.isNotEmpty( generatorName ) ) {
            fallbackSequenceName = generatorName;
        }
    }
    

    新的默认行为是使用生成器名称作为序列名称。因此,从hibernate 5.2迁移到5.3有两种可能:

    • 将生成器名称更改为序列名称
    • hibernate.model.generator_name_as_sequence_name false 在hibernate配置中(或生成器参数)
        2
  •  1
  •   fl0w    6 年前

    生成器名称被解释为属于特定的模式,重命名应该解决这个问题-避免使用点。

    https://docs.jboss.org/hibernate/stable/orm/userguide/html_single/Hibernate_User_Guide.html