Java 为什么Spring数据jdbc不保存我的汽车对象?

Java 为什么Spring数据jdbc不保存我的汽车对象?,java,insert,spring-data-jdbc,Java,Insert,Spring Data Jdbc,我在使用spring数据jdbc时发现了一个问题,我无法用Google解决这个问题 无论我尝试做什么,我都无法将一个微不足道的对象推入数据库(Bean1.java:25): carRepository.save(新车(2L,“宝马”,“5”) 如果没有一个和一个TransactionManager+@Transactional,数据库(显然)不会提交记录 代码基于Postgres数据库,但您也可以简单地使用下面的H2,并获得相同的结果 以下是(最低限度的)源代码: 有人能告诉我,为什么没有将汽

我在使用spring数据jdbc时发现了一个问题,我无法用Google解决这个问题

无论我尝试做什么,我都无法将一个微不足道的对象推入数据库(Bean1.java:25):
carRepository.save(新车(2L,“宝马”,“5”)

如果没有一个和一个TransactionManager+
@Transactional
,数据库(显然)不会提交记录

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

以下是(最低限度的)源代码:


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

这与交易不起作用无关。 相反,它是关于Spring数据JDBC的,将您的实例视为需要更新(而不是插入)的现有实例

您可以通过for
org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate
验证这就是问题所在。您应该看到一个
更新
,但没有
插入

默认情况下,当Spring数据JDBC的id为对象类型、值为
null
或基元类型(例如
int
long
)且值为
0
时,它会将实体视为新实体。 如果实体具有带有
@Version
注释的属性,则该属性将用于确定实例是否为新实例

要使其正常工作,您可以选择以下选项:

  • 将id设置为
    null
    ,并配置数据库架构,以便在插入时自动创建新值。保存后,实体实例将包含从数据库生成的值

    注意:Spring数据JDBC将设置id,即使它是实体中的最终id

  • 保留id
    null
    ,并在保存前侦听器中将其设置为所需的值

  • 让您的实体实现。这允许您控制实体被视为新实体的时间。您可能还需要一个侦听器,以便让实体知道它不再是新的

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


  • 有一个密切相关的问题:我昨天问了一个类似的问题,Jens很好地将我的问题与这个问题联系起来,我确认这个答案基本上是重复我的问题。所以我只想对Jens说声谢谢。谢谢Jens!这仅适用于聚合根吗?我刚刚注意到我有一个子类,它在持久化之前在客户机代码中设置了它的PK(它使用UUID供参考),它似乎工作得很好。长答案请另问一个问题。