为什么Spring-data-jdbc没有保存我的Car对象?

时间:2018-05-16 13:05:19

标签: java insert spring-data-jdbc

我正在使用spring-data-jdbc并发现了一个问题,我无法用Google解决。

无论我尝试做什么,我都无法将一个简单的对象推入数据库(Bean1.java:25): carRepository.save(new Car(2L, "BMW", "5"));

两者都没有,并且有一个TransactionManager + @Transactional数据库(显然)没有提交记录。

代码基于Postgres数据库,但您也可以简单地使用下面的H2并获得相同的结果。

这是(简约)源代码: https://github.com/bitmagier/spring-data-jdbc-sandbox/tree/stackoverflow-question

有人可以告诉我,为什么汽车没有插入数据库?

1 个答案:

答案 0 :(得分:11)

这与无效的交易无关。 相反,它是关于Spring Data JDBC的,考虑到您的实例需要更新(而不是插入)的现有实例。

您可以{ "speech": "hello my name is shubham", "displayText": "hello testing", "source": "webhook" } org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate验证这是问题所在。您应该看到update但没有insert

默认情况下,Spring Data JDBC在实体具有对象类型的id且值为null或基本类型(例如intlong时将实体视为新实体)和值0

您可以使用以下选项:

  1. 将id设置为null并配置数据库架构,以便它自动在insert上创建新值。保存后,您的实体实例将包含数据库中生成的值。

    注意:Spring Data JDBC将设置id,即使它在您的实体中是最终的。

  2. 保留标识null并将其在Before-Save监听器中设置为所需的值。

  3. 让您的实体实施activating logging。这允许您控制实体何时被视为 new 。你可能也需要一个监听器,所以你可以让实体知道它不再是新的。

  4. 从Spring Data JDBC 1.1版开始,您还可以使用JdbcAggregateTemplate进行直接插入,而不检查ID,请参阅https://jira.spring.io/browse/DATAJDBC-282。当然,您可以在存储库的自定义方法中执行此操作,如此示例中所示:Persistable