keyHolder.getKey() 返回 null

2022-09-02 03:19:04

为什么来自“Spring in action 5”的代码不起作用(keyHolder.getKey()返回null,但实体保存在DB中)?

private long savePizzaInfo(Pizza pizza) {
    pizza.setCreatedAt(new Date());
    PreparedStatementCreator psc =
            new PreparedStatementCreatorFactory(
                    "insert into PIZZA (name, createdAt) values (?, ?)",
                    Types.VARCHAR, Types.TIMESTAMP
            ).newPreparedStatementCreator(
                    Arrays.asList(
                            pizza.getName(),
                            new Timestamp(pizza.getCreatedAt().getTime())));
    KeyHolder keyHolder = new GeneratedKeyHolder();
    template.update(psc, keyHolder);
    return keyHolder.getKey().longValue();
}

我的数据库表:

CREATE TABLE PIZZA
(
ID bigint DEFAULT (NEXT VALUE FOR 
PUBLIC.SYSTEM_SEQUENCE_12CA966F_4FFD_469C_BA69_80BB93916EF3) AUTO_INCREMENT 
PRIMARY KEY NOT NULL,
NAME varchar(50) NOT NULL,
CREATEDAT timestamp NOT NULL
);
CREATE UNIQUE INDEX PRIMARY_KEY_4 ON PIZZA (ID);

答案 1

您必须指示实例返回生成的密钥:PreparedStatementCreatorFactory

PreparedStatementCreatorFactory preparedStatementCreatorFactory = new PreparedStatementCreatorFactory(
         "insert into PIZZA (name, createdAt) values (?, ?)",
         Types.VARCHAR, Types.TIMESTAMP
 );

// By default, returnGeneratedKeys = false so change it to true
preparedStatementCreatorFactory.setReturnGeneratedKeys(true);

 PreparedStatementCreator psc =
         preparedStatementCreatorFactory.newPreparedStatementCreator(
                    Arrays.asList(
                            pizza.getName(),
                            new Timestamp(pizza.getCreatedAt().getTime())));

答案 2

您需要指定预准备语句,请注意代码中的Statement.RETURN_GENERATED_KEYS,您需要类似如下的内容

final PreparedStatementCreator psc = new PreparedStatementCreator() {
      @Override
      public PreparedStatement createPreparedStatement(final Connection connection) throws SQLException {
        final PreparedStatement ps = connection.prepareStatement("INSERT INTO `names` (`name`) VALUES (?)",
            Statement.RETURN_GENERATED_KEYS);
        ps.setString(1, name);
        return ps;
      }
    };

推荐