批处理插入中的 Postgres 错误:关系“hibernate_sequence”不存在位置 17

2022-08-31 14:07:29

我正在执行休眠jpa批处理更新,它给我以下错误

2015-04-21 15:53:51,907 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (Thread-283 (HornetQ-client-global-threads-462057890)) SQL Error: 0, SQLState: 42P01
2015-04-21 15:53:51,908 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (Thread-283 (HornetQ-client-global-threads-462057890)) ERROR: relation "my_seq_gen" does not exist

我正在使用postgres数据库,我的ID是自动生成的

  @Id
@SequenceGenerator(name="seq-gen",sequenceName="MY_SEQ_GEN"initialValue=205, allocationSize=12)
@GeneratedValue(strategy= GenerationType.SEQUENCE, generator="seq-gen")
@Column(name="\"ID\"",unique=true,nullable=false)
private int id;

这是我的批量插入代码片段

getEm().getTransaction().begin();
System.out.println("transaction started--------------");
try {   
    for (Receipt ReceiptEntity : arrReceiptEntity) {
            getEm().persist(ReceiptEntity);
    }
    getEm().getTransaction().commit();
    System.out.println("commited");
} catch (Exception exception) {
    System.out.println("error----------------------------------------------------------------------");
    if(getEm().getTransaction().isActive())
        getEm().getTransaction().rollback();
    LOG.error(exception);
} finally {
    getEm().flush();
    getEm().clear();
    getEm().close();
}

我在持久性中添加了以下属性.xml

         <property name="hibernate.id.new_generator_mappings" value="true"/>

请建议我做错了什么。


答案 1

尝试用 和 注释您的。id@Id@GeneratedValue(strategy = GenerationType.IDENTITY)

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

更新:仅当 id 列声明为 或 类型时,它才有效。SERIALBIGSERIAL


答案 2

如果您不想更改实体定义,则需要在 postgreSQL 模式中创建一个名为 的序列。hibernate_sequence

CREATE SEQUENCE hibernate_sequence START 1;

更新

您缺少为实体定义的第二个序列 generatef,只需像上一个序列一样添加它:

CREATE SEQUENCE my_seq_gen START 1;

什么是序列?

序列是整数的有序列表。序列中数字的顺序很重要。您可以配置最小值和最大值,以及应将其递增的量:

CREATE SEQUENCE [ IF NOT EXISTS ] sequence_name
  [ AS { SMALLINT | INT | BIGINT } ]
  [ INCREMENT [ BY ] increment ]
  [ MINVALUE minvalue | NO MINVALUE ] 
  [ MAXVALUE maxvalue | NO MAXVALUE ]
  [ START [ WITH ] start ] 
  [ CACHE cache ] 
  [ [ NO ] CYCLE ]

不可以,您可以使用 SQL 命令和休眠等函数从集合中获取下一个值。这比在sequence_table中保持当前主键值或在现有表中查找最大PK值便宜得多。因此,它提供了一种简单而便宜的方法来查找给定表的下一个PK。nextval('')

所有表通常都使用专用的 Sequance,就像在此示例中一样,它被选为 IdGenerator 策略。

疼痛有用的教程:


推荐