如何修复Spring Boot应用程序中SimpleJdbcInsert中的错误

问题描述 投票:0回答:1

我学习Spring Boot阅读书Spring in Action 5.我尝试将数据插入H2嵌入式数据库。我使用SimpleJdbcInsert和executeAndReturnKey方法。

这是一个构造函数:

 @Autowired
public JdbcOrderRepository(JdbcTemplate jdbc) {

this.orderInserter = new SimpleJdbcInsert(jdbc).withTableName("Taco_Order").usingGeneratedKeyColumns("id");
    this.orderTacoInserter = new SimpleJdbcInsert(jdbc).withTableName("Taco_Order_Tacos");
    this.objectMapper = new ObjectMapper();
}

以下是插入数据的方法:

@Override
public Order save(Order order) {

    order.setPlacedAt(new Date());
    long orderId = saveOrderDetails(order);
    order.setId(orderId);
    List<Taco> tacos = order.getTacos();

    for (Taco taco : tacos)
        saveTacoToOrder(taco, orderId);

    return order;
}

private long saveOrderDetails(Order order) {
    Map<String, Object> values = objectMapper.convertValue(order, Map.class);
    values.put("placedAt", order.getPlacedAt());
    long orderId = orderInserter.executeAndReturnKey(values).longValue();

    return orderId;
}

错误在此字符串上:

long orderId = orderInserter.executeAndReturnKey(values).longValue();

错误文字:

 There was an unexpected error (type=Internal Server Error, status=500).
PreparedStatementCallback; ???????? NULL ?? ????????? ??? ???? 
"DELIVERYNAME" NULL not allowed for column "DELIVERYNAME"; SQL statement: 
INSERT INTO Taco_Order (DELIVERYNAME, DELIVERYSTREET, DELIVERYCITY, 
DELIVERYSTATE, DELIVERYZIP, CCNUMBER, CCEXPIRATION, CCCVV, PLACEDAT) 
VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?) [23502-197]; nested exception is 
org.h2.jdbc.JdbcSQLException: ???????? NULL ?? ????????? ??? ???? 
"DELIVERYNAME" NULL not allowed for column "DELIVERYNAME"; SQL statement: 
INSERT INTO Taco_Order (DELIVERYNAME, DELIVERYSTREET, DELIVERYCITY, 
DELIVERYSTATE, DELIVERYZIP, CCNUMBER, CCEXPIRATION, CCCVV, PLACEDAT) 
   VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?) [23502-197]

Bur在调试器中一切正常:值参数由值完全加载。 qazxsw poi

班级订单:

idea screensot

如何解决此问题并使用SimpleJdbcInsert将数据插入H2数据库?

java spring spring-boot jdbctemplate
1个回答
0
投票

我浏览了屏幕截图,我没有看到列DELIVERYNAME的任何值。

问题是因为您在其中运行Insert操作的表不允许列DELIVERYNAME的空值。

解决这个问题的方法: -

  1. 从表定义中的列中删除NOT Null约束。
  2. 如果您不确定数据是否为空,请从对象的成员中删除@NotBlank Annotation。
  3. 使用Table中的列名称与Class / Entity Definition中具有成员名称的列名称之间的正确映射。您可以使用@Column注释轻松完成此操作。

根据您的代码和屏幕截图,我可以理解,问题是由于列名与对象成员之间的映射不正确。建议不要依赖Spring Boot编码器的自动映射,而应使用@Column注释或通过hibernate配置文件映射手动进行映射。

© www.soinside.com 2019 - 2024. All rights reserved.