java - 使用 JPA 进行 Spring Boot。无法保存到 SQL Server 中的自动增量字段字段。空错误

标签 java sql-server api jpa spring-boot

enter image description here我正在尝试使用 Spring Boot 和 JPA 学习一些 API 开发,并且我在数据库中有这个表,并将 id 列指定为具有自动增量的主键。当我提交数据时,我不断收到此错误:

com.microsoft.sqlserver.jdbc.SQLServerException: Cannot insert the value NULL into column 'Id', table

在我的类(class)中,我有这个作为 id。您可能会说为什么@Column(name='Id')。我在排除故障时开始添加此内容。当我从表中读取信息时,之前和现在经过一些更改后代码工作正常。

package com.FUT.track.web.FUTtrackapplication.squads;

import javax.persistence.*;

@Entity
@Table(name="Squads")
public class Squad {

@Id
@GeneratedValue( strategy = GenerationType.IDENTITY )
@Column(name ="Id", nullable = false, unique = true)
public int id;
public String squadName;
public String squadDescription;
public String primaryFormation;


public Squad() {

}


public Squad(int id, String squadName, String squadDescription, String 

primaryFormation) {
    super();
    this.id = id;
    this.squadName = squadName;
    this.squadDescription = squadDescription;
    this.primaryFormation = primaryFormation;

}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getSquadName() {
    return squadName;
}

public void setSquadName(String squadName) {
    this.squadName = squadName;
}

public String getSquadDescription() {
    return squadDescription;
}

public void setSquadDescription(String squadDescription) {
    this.squadDescription = squadDescription;
}

public String getPrimaryFormation() {
    return primaryFormation;
}

public void setPrimaryFormation(String primaryFormation) {
    this.primaryFormation = primaryFormation;
}

}

不确定 ie @GenerateValue(strategy = GenerationType.IDENTITY) 是否需要,但无论有没有它,我仍然不断收到相同的错误。我正在提交除 id 之外的所有字段的数据。所有其他字段都可以存储空值,因此即使没有提交任何内容,我也认为应该为新列生成 id。但由于某种原因它不起作用。

也在我的应用程序属性文件中:

spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

有什么建议吗?

最佳答案

尝试做这样的事情:

import javax.persistence.*;

@Entity
@Table(name = "Squads")
public class Squad{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "Id", nullable = false, unique = true)
    public int id;

    @Column(name = "SquadName", nullable = false)
    private String squadName;

    @Column(name = "SquadDescription", nullable = false)
    private String squadDescription;

    @Column(name = "PrimaryFormation", nullable = false)
    private String primaryFormation;

    public Squad(){

    }

    public Squad(final String squadName, final String squadDescription, final String primaryFormation){

        this.squadName = squadName;
        this.squadDescription = squadDescription;
        this.primaryFormation = primaryFormation;
    }

    public int getId(){

        return id;
    }

    public void setId(final int id){

        this.id = id;
    }

    public String getSquadName(){

        return squadName;
    }

    public void setSquadName(final String squadName){

        this.squadName = squadName;
    }

    public String getSquadDescription(){

        return squadDescription;
    }

    public void setSquadDescription(final String squadDescription){

        this.squadDescription = squadDescription;
    }

    public String getPrimaryFormation(){

        return primaryFormation;
    }

    public void setPrimaryFormation(final String primaryFormation){

        this.primaryFormation = primaryFormation;
    }
}

请注意我如何不在构造函数中包含“id”。此外,我还为每个字段添加了列名称。我假设您或您的 DBA 想要使用驼峰式命名而不是下划线命名,因此在您的“application.properties”文件(或 yml ...无论如何)中,设置物理命名策略,如下所示:

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

大多数使用 Microsoft SQL Server 的数据库开发人员和管理员更喜欢使用驼峰式命名表和列名称,而不是使用 JPA 和 Spring 假定的默认下划线方法。例如,大多数情况下,在 Java/Spring 中,您期望表名称为“MY_TABLE”,但在 SQL Server 中,您可能会拥有表名称“MyTable”。由于这在 Spring 生态系统中是非标准的,因此您需要指定不同的命名策略。

关于java - 使用 JPA 进行 Spring Boot。无法保存到 SQL Server 中的自动增量字段字段。空错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47190331/

相关文章:

python - 编程从 Bloomberg 终端获取数据

java - 使用哪些缓冲区从 ServerSocket 创建的 Socket 接收输入流?

java - 如何修复 Gradle 同步失败 "Plugin with id ' com.android.application' 未找到”?

java - 如何在Visual Studio代码中调试Java

sql-server - 与服务器成功建立连接,但在登录前握手期间发生错误。(提供者 :TCP Provider, 错误:35)

oop - API — CFC与cfinclude

java - 安卓火力地堡 : Set Value not working

sql-server - 使用触发器查明插入、更新或删除了哪些行

sql - 向 SQL 中的每一行添加 1 天

javascript - 从 addCard trello API 创建 trello 卡后如何捕获它的链接?