批量插入中的Postgres错误:关系"hibernate_sequence"不存在位置17

kir*_*rti 25 java postgresql hibernate jpa

我正在执行hibernate 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
Run Code Online (Sandbox Code Playgroud)

我正在使用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;
Run Code Online (Sandbox Code Playgroud)

这是我的批量插入代码段

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();
}
Run Code Online (Sandbox Code Playgroud)

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

         <property name="hibernate.id.new_generator_mappings" value="true"/>
Run Code Online (Sandbox Code Playgroud)

请告诉我我做错了什么.

Vse*_*aev 44

尝试id使用@Id和注释你的注释@GeneratedValue(strategy=GenerationType.IDENTITY).它适用于PostgreSql.

更新:仅当您的id列声明为SERIALBIGSERIAL类型时才会起作用.

  • 对于 Postgresql 来说,IDENTITY 不是一个糟糕的选择吗?/sf/ask/702935691/ Generation-strategy-when-using-jpa-and-hibernate (2认同)
  • @VsevolodPoletaev。来自链接的回答提到 IDENTITY 在没有 SEQUENCE 选项时很有用,因为它会禁用批处理执行。但是后来发现在hibernate 5 IDENTITY中会把id绑定到SERIAL的序列上,所以应该没问题。谢谢你的回答。 (2认同)

Ber*_*eri 13

如果您不想更改实体定义,则需要在postgreSQL模式中使用名称创建序列hibernate_sequence.

CREATE SEQUENCE hibernate_sequence START 1;
Run Code Online (Sandbox Code Playgroud)

更新:

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

CREATE SEQUENCE my_seq_gen START 1;
Run Code Online (Sandbox Code Playgroud)

疼痛有用的教程:http: //www.concretepage.com/hibernate/generatedvalue-strategy-generationtype-sequence-hibernate


小智 6

我希望你得到答案,但如果你仍然找到答案,这可能会有所帮助.

我有同样的问题并解决了它用@SequenceGenerator和注释id的getter方法@GeneratedValue.

@SequenceGenerator(name="seq-gen",sequenceName="MY_SEQ_GEN", initialValue=205, allocationSize=12)
@GeneratedValue(strategy= GenerationType.SEQUENCE, generator="seq-gen")
public int getId(){
    return id;
}
Run Code Online (Sandbox Code Playgroud)


Abd*_*hed 5

检查application.properties文件。

确保 spring.jpa.hibernate.ddl-auto =更新

  • 不建议用于生产,首选方法是将 Flyway 与自定义 DDL 脚本结合使用。 (2认同)

May*_*yur 3

您可以尝试以下操作:

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO, generator = "auto_gen")
  @SequenceGenerator(name = "auto_gen", sequenceName = "A")
  @Column(name = "ID")
  private int id;
Run Code Online (Sandbox Code Playgroud)

谢谢