【问题标题】:How to use autogenerated ID in JdbcBatchItemWriter?如何在 JdbcBatchItemWriter 中使用自动生成的 ID?
【发布时间】:2014-04-25 17:12:26
【问题描述】:

我正在使用 Spring JdbcBatchItemWriter 将大量数据刷新到 postgres 数据库。

INSERT INTO customer (id, name, zip) VALUES (?,?,?)

我只设置 name + zip 因为我希望自动生成 id。但是我怎样才能让数据库自动生成 id 值呢?如果我执行上面的语句,数据库会抱怨没有设置 id。

@Entity
class Customer {
   @Id
   @GeneratedValue(strategy=GenerationType.AUTO)
   long id;
}

【问题讨论】:

  • 不要在插入语句中包含id 列。仅包括姓名和zipINSERT INTO customer (name, zip) values (?,?).
  • 我当然之前尝试过,但它给出了错误:ERROR : PSQLException: ERROR: NULL-value in column ?id? violates Not-Null-Constraint
  • 正确创建表格。请参阅 stackoverflow.com/questions/7718585/…stackoverflow.com/questions/3108777/… 了解 2 种可能的解决方案。
  • 该表是由休眠自动生成的,因为我还使用应用程序中的实体:CREATE TABLE customer ( id bigint NOT NULL, name character varying(255), zip character varying(255), CONSTRAINT customer_pkey PRIMARY KEY (id)); 但我还想使用 JdbcBatchItemWriter 进行批量导入。所以我不想自己创建数据库表,无论如何我希望自动生成 id。
  • 让 hibernate 自动生成你的模式,用于生产,通常是一个坏主意。我不相信 @GeneratedValue 会添加到您的 create table 语句中。如果您的插入与普通的 hibernate/jpa 一起工作,那么为什么不使用 JpaItemWriterHibernate ItemWriter

标签: java spring hibernate postgresql spring-batch


【解决方案1】:

知道了:

INSERT INTO customer (id, name, zip) VALUES (nextval('hibernate_sequence'), ?, ?)

【讨论】:

  • 更改数据库时应该注意,因为我认为nextval 是一个自定义的oracle 函数
  • @OussamaZoghlami 不,这是一个内置的 PostgreSQL 函数。如果您正在谈论更改为不同的数据库供应商,那么是的,此代码是特定于 PostgreSQL 方言的,但是当您绕过 Hibernate 时,您无论如何都要处理它。
猜你喜欢
  • 2016-02-06
  • 2016-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-22
  • 1970-01-01
  • 1970-01-01
  • 2017-08-25
相关资源
最近更新 更多