从休眠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未引用序列生成器上的任何更改。
可能是什么问题?
答案 0 :(得分:2)
我发现这是休眠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的不使用生成器名称的行为答案 1 :(得分:1)
您的生成器名称被解释为属于特定架构,重命名应解决此问题-避免使用点号。
请查看手册2.6.11节中有关如何命名和参数化生成器的内容:https://docs.jboss.org/hibernate/stable/orm/userguide/html_single/Hibernate_User_Guide.html