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

时间:2015-04-21 12:04:28

标签: java hibernate postgresql 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

我正在使用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();
}

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

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

请说明我做错了什么。

12 个答案:

答案 0 :(得分:33)

尝试使用id@Id@GeneratedValue(strategy=GenerationType.IDENTITY)添加注释。它适用于PostgreSql。

更新:仅当您的ID列被声明为SERIALBIGSERIAL类型时才会有效。

答案 1 :(得分:11)

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

CREATE SEQUENCE hibernate_sequence START 1;

<强>更新

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

CREATE SEQUENCE my_seq_gen START 1;

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

答案 2 :(得分:6)

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

我遇到了同样的问题并解决了使用@SequenceGenerator@GeneratedValue注释ID的getter方法。

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

答案 3 :(得分:3)

你可以试试以下:

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

由于

答案 4 :(得分:2)

我遇到了同样的问题。我解决了在postgres上的表中的id列上的自动增量,就像那样。

ALTER TABLE mytable ALTER COLUMN id SET DEFAULT nextval('mytable_id_seq');

ALTER SEQUENCE mytable_id_seq OWNED BY mytable.id; 

答案 5 :(得分:1)

在我的案例中添加属性name =“hibernate.hbm2ddl.auto”value =“ update ”,解决了这个问题。您必须在persistence.xml中添加提到的属性

答案 6 :(得分:1)

根据帖子hibernate could not get next sequence value ,将您的 @GeneratedId 列设置为策略 GenerationType.IDENTITY ,而不是 GenerationType.SEQUENCE 。所以,你会有

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

答案 7 :(得分:0)

有时带有@Id @GeneratedValue(strategy=GenerationType.IDENTITY)注释的序列可以具有空间隔(在删除后)和下一个自动递增位置不正确。尝试将下一个自动增量值设置为最大ID值之后的位置:

ALTER SEQUENCE schema.entity_id_seq RESTART WITH 40072;

答案 8 :(得分:0)

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

答案 9 :(得分:0)

将以下内容添加到application.properties

# Hibernate ddl auto (create, create-drop, validate, update)
spring.jpa.hibernate.ddl-auto = update 

这将明确设置为在Spring启动期间创建或更新所有表。

答案 10 :(得分:0)

检查 application.properties 文件。

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

答案 11 :(得分:0)

最近,我遇到了同样的问题,并通过使用@GenericGenerator注释解决了该问题。问题是因为我不得不在liquibase changelog中插入带有SQL语句的数百行,并且hibernate在生成ID之前不知道最后一行及其内容。

@Entity(name = "domain")
@Table(name = "domain", schema = "public")
public class DomainJpa {

    @Getter
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "incrementDomain")
    @GenericGenerator(name = "incrementDomain", strategy = "increment")
    private Integer id;

}

希望这对某人有用。干杯:)