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

bit*_*ier 8 java insert spring-data-jdbc

我正在玩spring-data-jdbc并发现了一个问题,我用谷歌无法解决.

无论我尝试做什么,我都无法将一个简单的对象推入数据库(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

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

Jen*_*der 16

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

您可以验证这是问题启动日志记录org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.你应该看到一个update但没有insert.

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

您有以下选项,以使其工作:

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

    注意:Spring Data JDBC即使在您的实体中是最终的,也会设置id.

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

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

  4. 从Spring Data JDBC 1.1版开始,您还可以使用a JdbcAggregateTemplate来执行直接插入,而无需检查id,请参阅https://jira.spring.io/browse/DATAJDBC-282.当然,您可以在存储库的自定义方法中执行此操作,如此示例中所示:https://github.com/spring-projects/spring-data-examples/pull/441