如何在PreparedStatement中使用自动生成的@Id?

时间:2015-11-05 09:13:02

标签: java spring hibernate postgresql spring-batch

我正在使用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:错误:列中的NULL值?id?违反了Not-Null-Constraint。

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

1 个答案:

答案 0 :(得分:2)

由于您正在处理JPA实体,因此您不能使用不知道JPA注释的JdbcBatchItemWriter,而是使用JpaItemWriter

示例配置为:

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

其中entityManagerFactory是您的实体经理工厂bean。然后,您可以直接使用此ItemWriter或将其作为代理注入另一个ItemWriter

如果您想使用JPA进行批处理,请参阅this question