繁体   English   中英

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

[英]Why does Spring-data-jdbc not save my Car object?

我正在玩 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

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

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

您可以通过激活org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate的日志记录来验证这是问题所在。 您应该会看到update但没有insert

默认情况下,当一个实体具有对象类型的 id 和null或原始类型(例如intlong )的值和0的值时,Spring Data JDBC 将实体视为新实体。 如果您的实体具有带有@Version注释的属性,则该属性将用于确定实例是否是新实例。

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

  1. 将 id 设置为null并配置您的数据库模式,以便在插入时自动创建一个新值。 保存后,您的实体实例将包含从数据库生成的值。

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

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

  3. 让您的实体实现Persistable 这使您可以控制何时将实体视为实体。 您可能还需要一个侦听器,以便让实体知道它不再是新的。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM