【问题标题】:Hibernate expects sequence instead of table for postgresHibernate 期望 postgres 的序列而不是表
【发布时间】:2017-03-09 18:48:49
【问题描述】:

我的 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 在我们的开发服务器上部署应用程序时,hibernate 需要一个数据库序列而不是使用序列表:org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing sequence [hibernate_sequence] 我认为使用 TableGenerator 策略不需要任何数据库上的序列。

在休眠 5.0.11.Final 中使用 Spring Boot

此时我们不知道生产中将使用哪些数据库,因此我需要一个可移植的解决方案。 (至少支持Oracle、MsSQL、Postgres、MySql……所以事实上几乎所有东西)

更新: 我已经安装了本地 postgres 并手动添加了序列以检查它是否使用。它确实被使用(计数器为 3),但我不知道是哪个实体。 我还为实体审计启用了休眠环境。 revinfo 表使用单独的序列,但这个序列是由 liquibase 创建的。

原来,hibernate envers 默认实体使用@GeneratedValue,因此需要序列

提前致谢。如果您需要更多信息,请随时询问。

【问题讨论】:

    标签: java spring postgresql hibernate liquibase


    【解决方案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,您会发现它不需要任何序列。

    【讨论】:

    • 您好,感谢您的回答。我必须调查一下。我有一些实体,它们没有从这个基类继承,但它们没有生成 ID,只是 @Id 注释。
    • 我接受您的回答,因为您对确实存在另一个具有@GeneratedValue 的实体这一事实是正确的。它只是不在我自己的代码中,而是在 hibernate-envers 中。
    猜你喜欢
    • 2015-01-08
    • 2016-10-17
    • 2019-11-29
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    相关资源
    最近更新 更多