我正在使用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
有人可以告诉我,为什么汽车没有插入数据库?
答案 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
或基本类型(例如int
或long
时将实体视为新实体)和值0
。
您可以使用以下选项:
将id设置为null
并配置数据库架构,以便它自动在insert上创建新值。保存后,您的实体实例将包含数据库中生成的值。
注意:Spring Data JDBC将设置id,即使它在您的实体中是最终的。
保留标识null
并将其在Before-Save监听器中设置为所需的值。
让您的实体实施activating logging。这允许您控制实体何时被视为 new 。你可能也需要一个监听器,所以你可以让实体知道它不再是新的。
从Spring Data JDBC 1.1版开始,您还可以使用JdbcAggregateTemplate
进行直接插入,而不检查ID,请参阅https://jira.spring.io/browse/DATAJDBC-282
。当然,您可以在存储库的自定义方法中执行此操作,如此示例中所示:Persistable