【问题标题】:when migrating from hibernate 5.2 to 5.3, hibernate tries to use a weird sequence从 hibernate 5.2 迁移到 5.3 时,hibernate 尝试使用奇怪的序列
【发布时间】:2018-09-17 19:58:17
【问题描述】:

从休眠 5.2.17 升级到 5.3.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;

使用 hibernate 5.2 它可以按预期工作,但不再使用 hibernate 5.3。

此处的迁移指南:https://github.com/hibernate/hibernate-orm/blob/5.3/migration-guide.adoc 不引用序列生成器的任何更改。

可能是什么问题?

【问题讨论】:

  • 尝试将您的序列生成器命名为 SequenceGenerator 或其他名称,而不是 enhanced.SequenceStyleGenerator,然后重试。

标签: java hibernate


【解决方案1】:

我发现这是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,恢复为不使用生成器名称的休眠5.2 行为

【讨论】:

【解决方案2】:

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

请查看手册第 2.6.11 节,了解如何命名和参数化生成器:https://docs.jboss.org/hibernate/stable/orm/userguide/html_single/Hibernate_User_Guide.html

【讨论】:

  • 文档的第 2.6.11 节是关于2.6.11. Using UUID generation。我在本节中没有看到对生成器名称的引用。你确定你reerenced正确的部分?删除点是正确方向的提示:) 我发现我可能需要将生成器重命名为休眠序列名称(在我的情况下为 hibernate_sequence,因为我没有更改默认值)
猜你喜欢
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
  • 2015-12-18
  • 1970-01-01
  • 2018-07-02
  • 1970-01-01
  • 2018-04-15
  • 1970-01-01
相关资源
最近更新 更多