我正在尝试使用 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/