首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在SpringBoot应用程序中修复SimpleJdbcInsert错误

如何在SpringBoot应用程序中修复SimpleJdbcInsert错误
EN

Stack Overflow用户
提问于 2019-03-24 06:38:01
回答 6查看 1.3K关注 0票数 0

我通过阅读Spring in Action 5这本书学习了Spring Boot。我尝试将数据插入到H2嵌入式数据库中。我使用SimpleJdbcInsert和executeAndReturnKey方法。

下面是一个构造函数:

代码语言:javascript
复制
 @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();
}

以下是插入数据的方法:

代码语言:javascript
复制
@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;
}

错误在这个字符串上:

代码语言:javascript
复制
long orderId = orderInserter.executeAndReturnKey(values).longValue();

错误文本:

代码语言:javascript
复制
 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]

但在调试器中,一切都很好: value参数完全由值加载。idea screensot

类顺序:

代码语言:javascript
复制
@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数据库中?

EN

回答 6

Stack Overflow用户

发布于 2019-10-18 10:35:55

今天我也遇到了同样的问题。我能够解决这个问题。

要修复此删除,请转到schema.sql(您在其中创建表的文件),并从Taco_Order表中的字段中删除传送。

出自书本

SimpleJdbcInsert有两个用于执行插入的有用方法: execute()和executeAndReturnKey()。两者都接受映射,其中映射键与数据插入到的表中的列名相对应。映射值将插入到这些列中。

关键字名称是来自Order.java的字段

票数 1
EN

Stack Overflow用户

发布于 2019-03-25 22:29:07

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

这个问题是因为您正在运行insert操作的表不允许列DELIVERYNAME为NULL值。

解决此问题的方法:

如果您不确定数据是否为空,请从对象成员的表definition.

  • Remove
  1. 中的列中删除NOT NULL约束。
  2. 在table中的列名和Class/Entity定义中具有成员名的列名之间使用正确的映射。您可以使用@Column注释轻松完成此操作。

根据我对你的代码和截图的理解,这个问题是由于列名和对象成员名之间的不正确映射造成的。建议程序员使用@Column注释或通过hibernate配置文件手动进行映射,而不是依赖Spring Boot的自动映射。

票数 0
EN

Stack Overflow用户

发布于 2019-09-27 11:23:41

问题出在Order类中的属性名称上。它们应该是各自表的列名称的镜像。例如:

私有字符串deliveryName;->将映射到数据库中的deliveryName字段。

出现了这个问题,因为在schema.sql中,字段被命名为"deliveryName“,而在配料类中,属性被命名为"name”。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55319027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档