java - 如何修复 SpringBoot 应用程序中 SimpleJdbcInsert 中的错误
问题描述
我学习 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 调试器 evrything 没问题:value 参数完全由值加载。 想法截图
上课顺序:
@Data
public class Order {
@NotBlank(message = "Name is required")
private String name;
@NotBlank(message = "Name is required")
private String street;
@NotBlank(message = "Name is required")
private String city;
@NotBlank(message = "Name is required")
private String state;
@NotBlank(message = "Name is required")
private String zip;
@CreditCardNumber(message = "Not valid cc")
private String ccNumber;
@Pattern(regexp = "^(0[1-9]|1[0-2])([\\/])([1-9][0-9])$", message = "Must be formatted MM/YY")
private String ccExpiration;
@Digits(integer = 3, fraction = 0, message = "Invalid CVV")
private String ccCVV;
private Long id;
private Date placedAt;
List<Taco> tacos = new ArrayList<>();
public void addDesign(Taco design) {
this.tacos.add(design);
}
}
如何解决此问题并使用 SimpleJdbcInsert 将数据插入 H2 数据库?
解决方案
我今天面临同样的问题。我能够解决这个问题。
要修复此删除,请转到 schema.sql(您在其中创建表的文件)并从 Taco_Order 表中的字段中删除交付。
从书
SimpleJdbcInsert 有几个有用的方法来执行插入:execute() 和 executeAndReturnKey()。两者都接受一个映射,其中映射键对应于插入数据的表中的列名。地图值被插入到这些列中。
键名是 Order.java 中的字段
推荐阅读
- javascript - 如何显示来自返回对象而不是数组的 api 调用的数据
- python - 在 Python 中使用异常处理来打破 While 循环
- foreach - 指标数学警报:如何使用 for_each 表达式在动态块中循环指标?
- java - 如何使用 RecyclerView 显示数组?
- excel - 切换到 64 位 Excel 后如何修复 VBA“类型不匹配”错误
- r - 在传单热图中添加弹出标签
- c - 强制函数返回 NULL 而不是预定的 return_type
- .net-core - 如何在 C# 测试用例中添加 Mock db 表
- android - 收到错误 java.lang.NumberFormatException:空字符串
- android - 在 Kotlin 中获取新用户位置不起作用