java - 如何通过遗留映射在 Hibernate 5 中指定基于序列的生成值

标签 java hibernate hibernate-mapping

我有一个类似于 this question 的问题但以一种稍微不同的方式,一切就变得不同了。

我的问题是,我正在将项目组合从 Java 8/Hibernate 4.x 堆栈迁移到 Java 11/Hibernate 5.4 堆栈。

在第二种情况下,一旦应用程序尝试保存对象,我就会收到此错误:

org.postgresql.util.PSQLException: ERROR: relation "hibernate_sequence" does not exist

我上面提到的另一个问题的答案提供了一些见解,但我仍然不明白为什么会发生该错误:我们所有的实体都在使用每个自己的序列,并且该序列在相应的 hbm.xml 中明确指定。这是一个这样的映射文件:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping default-lazy="false">
    <class name="…" table="data_receiving">
        <id name="systemId" column="system_id">
            <generator class="sequence">
                <param name="sequence">system_id_seq</param>
            </generator>
        </id>
        <property name="source" column="source" />
        …
    </class>
</hibernate-mapping>

看起来序列的规范被忽略了。我查找了一些旧版 Hibernate 与 XML 映射的文档,但找不到与 Hibernate 5 相关的任何内容,据报道 still supports such mappings .

解决方案可能是完全迁移到注释,但该组合包含十几个应用程序,其中有数十个表和总列数(在一个应用程序中)超过 1200 个。这项任务根本不切实际,更重要的是因为一些应用程序正在从头开始重写为微服务。

我的问题是我所使用的序列生成标识符的规范是否仍然受支持?

最佳答案

我必须深入研究 Hibernate 的源代码才能发现一个问题:参数 sequence 已重命名为 sequence_name

<param name="sequence">system_id_seq</param>

现在必须是

<param name="sequence_name">system_id_seq</param>

这使得有必要更新所有 hbm.xml 文件,我在 Eclipse 中使用查找和替换来完成此操作。

关于java - 如何通过遗留映射在 Hibernate 5 中指定基于序列的生成值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57527117/

相关文章:

java - 如何使用hibernate更新数据库?

java - Hibernate 抛出 "NULL not allowed for column",因为使用 @MapsId 时 SQL INSERT 中缺少 JPA OneToOne 关系 FK

java - 无法在主线程上访问数据库,因为它可能会长时间锁定 UI 错误

Java正则表达式匹配确切数量的破折号

java - 什么是 hbase 压缩文件大小

java - 无法在 servlet init 方法中构建 session 工厂

java - hibernate - org.hibernate.QueryException : could not resolve property:

mysql - 在 Hibernate 中使用注解映射表的问题

java - Apache Tomcat 主页打不开

hibernate - 使用EclipseLink和Hibernate(JPA2.1)生成模式-忽略@ForeignKey