Java 为什么Spring数据jdbc不保存我的汽车对象?
我在使用spring数据jdbc时发现了一个问题,我无法用Google解决这个问题 无论我尝试做什么,我都无法将一个微不足道的对象推入数据库(Bean1.java:25):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,并获得相同的结果 以下是(最低限度的)源代码: 有人能告诉我,为什么没有将汽
carRepository.save(新车(2L,“宝马”,“5”)代码>
如果没有一个和一个TransactionManager+@Transactional
,数据库(显然)不会提交记录
代码基于Postgres数据库,但您也可以简单地使用下面的H2,并获得相同的结果
以下是(最低限度的)源代码:
有人能告诉我,为什么没有将汽车插入数据库?这与交易不起作用无关。
相反,它是关于Spring数据JDBC的,将您的实例视为需要更新(而不是插入)的现有实例
您可以通过fororg.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate
验证这就是问题所在。您应该看到一个更新
,但没有插入
默认情况下,当Spring数据JDBC的id为对象类型、值为null
或基元类型(例如int
或long
)且值为0
时,它会将实体视为新实体。
如果实体具有带有@Version
注释的属性,则该属性将用于确定实例是否为新实例
要使其正常工作,您可以选择以下选项:
将id设置为null
,并配置数据库架构,以便在插入时自动创建新值。保存后,实体实例将包含从数据库生成的值
注意:Spring数据JDBC将设置id,即使它是实体中的最终id
保留idnull
,并在保存前侦听器中将其设置为所需的值
让您的实体实现。这允许您控制实体被视为新实体的时间。您可能还需要一个侦听器,以便让实体知道它不再是新的
从Spring Data JDBC的1.1版开始,您还可以使用JdbcAggregateTemplate
直接插入,而无需检查id,请参见https://jira.spring.io/browse/DATAJDBC-282
。当然,您可以在存储库的自定义方法中执行此操作,如本例所示:
有一个密切相关的问题:我昨天问了一个类似的问题,Jens很好地将我的问题与这个问题联系起来,我确认这个答案基本上是重复我的问题。所以我只想对Jens说声谢谢。谢谢Jens!这仅适用于聚合根吗?我刚刚注意到我有一个子类,它在持久化之前在客户机代码中设置了它的PK(它使用UUID供参考),它似乎工作得很好。长答案请另问一个问题。