【问题标题】:How to use auto-generated @Id in PreparedStatement?如何在 PreparedStatement 中使用自动生成的@Id?
【发布时间】:2016-02-06 01:07:00
【问题描述】:

我正在使用PreparedStatement 将值批量插入到postgres 数据库中,如下所示:

JdbcBatchItemWriter<FieldSet> w = new JdbcBatchItemWriter<>();
w.setDataSource(ds);
w.setSql("INSERT INTO my_table(firstname,lastname) VALUES(?,?)");
w.setItemPreparedStatementSetter(new ItemPreparedStatementSetter() {
    //pseudocode
    ps.setString(1, "test");
    ps.setString(2, "testname");
});

问题:我的实体类还有一个自动生成的@Id,这里没有设置。

@Entity
public class MyEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    private String firstname, lastname;
}

因此,这会导致以下错误:

原因:org.postgresql.util.PSQLException: ERROR: NULL-value in column ?id?违反了 Not-Null-Constraint。

当然,因为我没有设置id。但是如何让它自动生成呢?

【问题讨论】:

标签: java spring hibernate postgresql spring-batch


【解决方案1】:

由于处理的是JPA实体,所以不能用JdbcBatchItemWriter,他不知道JPA注解,而是JpaItemWriter

一个示例配置是:

<bean id="jpaItemWriter" class="org.springframework.batch.item.database.JpaItemWriter">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>

entityManagerFactory 是您的实体管理器工厂 bean。然后你可以直接使用这个ItemWriter,或者将它作为一个委托注入另一个ItemWriter

如果你想用 JPA 做批处理,请参考this question

【讨论】:

  • 我不能使用JpaItemWriter,因为我必须在数据库中插入几百万行,而JpaItemWriter 对于这个选项来说太慢了(大约比JdbcBatchItemWriter 慢4 倍)。
  • @membersound 那么您应该在问题中说明它,而不是因为我提出了它(我不在您的脑海中)而否决了我的答案。另一方面,请参阅 this answer 以使用 JPA 进行批处理。
  • 非常感谢您的帮助。无论如何,问题是“如何在 PreparedStatement 中使用自动生成的”。我无法切换到 JPA 批处理,因为这太慢了!
  • @membersound 我回答说:“你不能那样做,改用JpaItemWriter”。我不认为告诉“你真的不能这样做,而是这样做”值得一票否决......如果 JPA 批处理对您的要求来说太慢,您必须放弃 JPA 和您的实体并手动插入:在数据库上设置一个序列并选择它来获取您生成的 id。
猜你喜欢
  • 2014-04-25
  • 1970-01-01
  • 2016-03-17
  • 1970-01-01
  • 2020-12-22
  • 1970-01-01
  • 1970-01-01
  • 2018-06-22
  • 1970-01-01
相关资源
最近更新 更多