我学习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数据库?
我浏览了屏幕截图,我没有看到列DELIVERYNAME的任何值。
问题是因为您在其中运行Insert操作的表不允许列DELIVERYNAME的空值。
解决这个问题的方法: -
根据您的代码和屏幕截图,我可以理解,问题是由于列名与对象成员之间的映射不正确。建议不要依赖Spring Boot编码器的自动映射,而应使用@Column注释或通过hibernate配置文件映射手动进行映射。