【问题标题】:HIbernate 5: generator class="sequence" not workingHIbernate 5:生成器类 =“序列”不工作
【发布时间】:2015-10-06 20:01:07
【问题描述】:

我有以下映射:

    <id name="id" type="java.lang.Long" column="id">
        <generator class="sequence">
            <param name="sequence">tracksdata_seq</param>
        </generator>
    </id>

当我在 Hibernate 4.2 中使用它时一切都很好。现在我正在迁移到 Hibernate 5 并面临以下问题:

2015-10-06 19:49:50 DEBUG SQL:92 - select nextval ('hibernate_sequence')
2015-10-06 19:49:50 DEBUG SqlExceptionHelper:122 - could not extract ResultSet [n/a]
org.postgresql.util.PSQLException: ERROR: relation "hibernate_sequence" does not exist

如何解决这个问题?

附:休眠 5.0.2.Final.

【问题讨论】:

  • 它正在寻找序列hibernate_sequence,你在上面的映射中提到过吗?你有tracksdata_seq,不确定是否指的是hyberante_sequence
  • 这不应该是指hibernate_sequence - 它必须使用tracksdata_seq,就像在hibernate 4.2中一样。
  • @maksim2020 我从 4.3.8 迁移到 5.0.6Final 时遇到了同样的问题。仅当您使用 XML 映射时才会发生这种情况。我切换到 JPA 注释,它工作正常。
  • 请注意,参数名称不再是“sequence”,而从版本 5 开始,它是“sequence_name”。见stackoverflow.com/questions/42191210/…

标签: java hibernate hibernate-5.x


【解决方案1】:

你有两个选择:

  1. 您将 hibernate.id.new_generator_mappings 配置属性设置为 false 并切换回旧的标识符生成器
  2. 您从这里更改映射如下:

    <generator class="sequence">
        <param name="sequence">MY_SEQUENCE</param>
    </generator>
    

    到:

    <generator class="org.hibernate.id.enhanced.SequenceStyleGenerator">
        <param name="optimizer">none</param>
        <param name="increment_size">1</param>
        <param name="sequence_name">MY_SEQUENCE</param>
    </generator>
    

【讨论】:

  • Spring 启动格式:spring.jpa.properties.hibernate.id.new_generator_mappings。但我还需要 spring.jpa.properties.hibernate.default_schema 让休眠使用正确的模式名称
【解决方案2】:

&lt;param name="sequence"&gt; 中使用"sequence_name" 而不是"sequence"

这对我有用。

【讨论】:

  • class="sequence" 生成器已被弃用,因此可能值得按照其他答案中的说明进行更改,但与此同时,此更改更容易,谢谢!
【解决方案3】:

我在从 Hibernate 4.3.10 迁移到 Hibernate 5.0.4 时也遇到了这个问题。与 maksim2020 一样,我将 &lt;generator class="sequence"&gt; 的实例替换为 &lt;generator class="identity"&gt;。但是,为了保留受影响表的 id 序列,我还必须编写一个 sql 迁移脚本,将列的默认值设置为现有序列的下一个值。在 PostgreSQL 中这样做如下:

ALTER TABLE ONLY affected_table ALTER COLUMN affected_id SET DEFAULT nextval('original_sequence'::regclass);

【讨论】:

    猜你喜欢
    • 2023-03-31
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多