我的id生成定义如下:
@Id
@GeneratedValue(generator = "pooled")
@GenericGenerator(name = "pooled", strategy = "org.hibernate.id.enhanced.TableGenerator", parameters = {
@Parameter(name = "value_column_name", value = "sequence_next_hi_value"),
@Parameter(name = "prefer_entity_table_as_segment_value", value = "true"),
@Parameter(name = "optimizer", value = "pooled-lo"),
@Parameter(name = "increment_size", value = "100")})
private Long id;
我正在使用liquibase生成表,让hibernate验证模式,以便忘记编辑更改日志 . hibernate_sequences
的liquibase定义如下:
<changeSet author="david (generated)" id="1477051164467-23">
<createTable tableName="hibernate_sequences">
<column name="sequence_name" type="varchar(255)">
<constraints nullable="false"/>
</column>
<column name="sequence_next_hi_value" type="bigint"/>
</createTable>
</changeSet>
这适用于我的本地SQLServer Express以及单元测试中使用的h2数据库 . 当我使用postgres在我们的dev服务器上部署应用程序时,hibernate需要一个数据库序列而不是使用序列表: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing sequence [hibernate_sequence]
我认为使用TableGenerator策略不需要任何数据库上的序列 .
使用Spring Boot和hibernate 5.0.11.Final
此时我们不知道将在 生产环境 中使用哪些数据库,因此我需要一个可移植的解决方案 . (至少支持Oracle,MsSQL,Postgres,MySql ......所以几乎所有东西都是如此)
更新:我已经安装了一个本地postgres并手动添加序列以检查它是否使用 . 它确实使用(计数器是3)但我不知道哪个实体 . 我还为实体审计启用了hibernate envers . revinfo表使用单独的序列,但这个序列是由liquibase创建的 .
Turned out, the hibernate envers default entity uses @GeneratedValue hence the need for the sequence
提前致谢 . 如果您需要更多信息,请随时提出 .
1 回答
请检查您的实体并检查它们是否全部使用
org.hibernate.id.enhanced.TableGenerator
. 这是唯一可能的原因 - 如果你看一下https://github.com/hibernate/hibernate-orm/blob/5.0.11/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableGenerator.java#L662,你会发现它不需要任何序列 .