为什么 Spring-data-jdbc 不保存我的 Car 对象?
Why does Spring-data-jdbc not save my Car object?
我在玩 spring-data-jdbc 并发现了一个问题,我无法使用 Google.[=29 解决=]
无论我尝试做什么,我都无法将一个微不足道的对象推送到数据库中 (Bean1.java:25):
carRepository.save(new Car(2L, "BMW", "5"));
两者都有,没有和有 TransactionManager +@Transactional
数据库(显然)不提交记录。
代码基于 Postgres 数据库,但您也可以简单地使用下面的 H2 并获得相同的结果。
这是(简约的)源代码:
https://github.com/bitmagier/spring-data-jdbc-sandbox/tree/Whosebug-question
谁能告诉我,为什么汽车没有插入数据库?
这与交易无效无关。
相反,它是关于 Spring 数据 JDBC 考虑到您的实例是一个需要更新(而不是插入)的现有实例。
您可以通过 activating logging for org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate
验证这是问题所在。您应该看到 update
但没有 insert
.
默认情况下,Spring 数据 JDBC 认为一个实体是新的,当它有一个对象类型的 id 和值 null
或原始类型(例如 int
或 long
) 和 0
的值。
如果您的实体具有带有 @Version
注释的属性,则该属性将用于确定实例是否为新实例。
为了使其正常工作,您有以下选择:
将 id 设置为 null
并配置您的数据库架构,以便它会在插入时自动创建一个新值。保存后您的实体实例将包含从数据库生成的值。
注意:Spring 数据 JDBC 将设置 ID,即使它在您的实体中是最终的。
保留 id null
并在 Before-Convert 侦听器中将其设置为所需的值。
让您的实体实施 Persistable
。这允许您控制何时将实体视为 new。你可能还需要一个监听器,这样你就可以让实体知道它不再是新的了。
从 Spring Data JDBC 的 1.1 版开始,您还可以使用 JdbcAggregateTemplate
直接插入,而无需检查 id ,参见 https://jira.spring.io/browse/DATAJDBC-282
。当然,您可以在存储库的自定义方法中执行此操作,如本示例中所做的那样:https://github.com/spring-projects/spring-data-examples/pull/441
我在玩 spring-data-jdbc 并发现了一个问题,我无法使用 Google.[=29 解决=]
无论我尝试做什么,我都无法将一个微不足道的对象推送到数据库中 (Bean1.java:25):
carRepository.save(new Car(2L, "BMW", "5"));
两者都有,没有和有 TransactionManager +@Transactional
数据库(显然)不提交记录。
代码基于 Postgres 数据库,但您也可以简单地使用下面的 H2 并获得相同的结果。
这是(简约的)源代码: https://github.com/bitmagier/spring-data-jdbc-sandbox/tree/Whosebug-question
谁能告诉我,为什么汽车没有插入数据库?
这与交易无效无关。 相反,它是关于 Spring 数据 JDBC 考虑到您的实例是一个需要更新(而不是插入)的现有实例。
您可以通过 activating logging for org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate
验证这是问题所在。您应该看到 update
但没有 insert
.
默认情况下,Spring 数据 JDBC 认为一个实体是新的,当它有一个对象类型的 id 和值 null
或原始类型(例如 int
或 long
) 和 0
的值。
如果您的实体具有带有 @Version
注释的属性,则该属性将用于确定实例是否为新实例。
为了使其正常工作,您有以下选择:
将 id 设置为
null
并配置您的数据库架构,以便它会在插入时自动创建一个新值。保存后您的实体实例将包含从数据库生成的值。注意:Spring 数据 JDBC 将设置 ID,即使它在您的实体中是最终的。
保留 id
null
并在 Before-Convert 侦听器中将其设置为所需的值。让您的实体实施
Persistable
。这允许您控制何时将实体视为 new。你可能还需要一个监听器,这样你就可以让实体知道它不再是新的了。从 Spring Data JDBC 的 1.1 版开始,您还可以使用
JdbcAggregateTemplate
直接插入,而无需检查 id ,参见https://jira.spring.io/browse/DATAJDBC-282
。当然,您可以在存储库的自定义方法中执行此操作,如本示例中所做的那样:https://github.com/spring-projects/spring-data-examples/pull/441