带有存储库保存方法更新ID的spring-data-jdbc更新

时间:2019-07-05 07:37:35

标签: java spring-data-jdbc

为非新建实体调用 CrudRepository save()方法会创建以下sql: UPDATE card SET id =?,customer_id =? ... WHERE id =?

这引发异常无法更新身份列“ id”

ID由数据库生成

使用的版本:1.0.6.RELEASE和1.0.9.RELEASE

数据库:mssql

为什么更新语句试图更新ID列,因为它是主键?

实体:

import org.springframework.data.annotation.Id;
import org.springframework.data.relational.core.mapping.Column;
import org.springframework.data.relational.core.mapping.Table;

@Table("card")
public class Card {

    @Id
    private Long id;

    @Column("customer_id")
    private String customerId;
...

存储库:

public interface CardRepository extends CrudRepository<Card, String> {
}

3 个答案:

答案 0 :(得分:2)

这听起来像https://jira.spring.io/browse/DATAJDBC-262,它已在版本1.1.M1中修复并发布,该开发分支的当前版本为1.1.RC1

切换到该版本应该可以解决问题。

注意:我已经看到您只提到了MS-SqlServer的例外情况,但尚未完全支持。

答案 1 :(得分:0)

您似乎尚未为ID设置ID生成策略。 添加它,然后尝试它是否起作用。

@GeneratedValue(strategy = GenerationType.AUTO) 

答案 2 :(得分:0)

如果实体的主键字段未标有@GeneratedValue,则不会生成自动主键值,并且应用程序负责通过初始化主键字段来设置主键。必须在尝试持久化实体对象之前完成该操作。另外,我认为您需要为Card实体实现Hashcode和Equals。