【问题标题】:How do I specify a default value for an identity variable in Spring Boot?如何在 Spring Boot 中为标识变量指定默认值?
【发布时间】:2022-01-12 00:37:48
【问题描述】:

我有一个 Spring Boot User 类,它总是出现错误“java.sql.SQLException:字段 'id' 没有默认值”。我曾多次尝试在 Java 类和数据库表中提供默认值,但无济于事。而且我也从生成类型=自动和=身份切换,但无济于事。非常感谢您的帮助。这是我的 Java 类和我的数据库表:

package com.ykirby.myfbapp;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.springframework.beans.factory.annotation.Value;

import java.sql.Timestamp;
import java.util.Date;  
@Entity // This tells Hibernate to make a table out of this class
public class User {
  
    
    
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    @Value("#{User.id ?: 0}")
    
    private int id = 12345;
    
    @Column(name = "fbuserid")
    private String fbuserid;
    @Column(name = "apttime")
    @Temporal(TemporalType.TIMESTAMP)
    private Date apttime;
    @Column(name = "apttitle")
    private String apttitle;
    @Column(name = "aptaddress")
    private String aptaddress;
    @Column(name = "aptlonglat")
    private String aptlonglat;
    @Column(name = "aptdetails")
    private String aptdetails;
public String getFbuserid() {
    return fbuserid;
}
public void setFbuserid(String fbuserid) {
    this.fbuserid = fbuserid;
}
public Date getApttime() {
    return apttime;
}
public void setApttime(Date apttime) {
    this.apttime = apttime;
}
public String getApttitle() {
    return apttitle;
}
public void setApttitle(String apttitle) {
    this.apttitle = apttitle;
}
public String getAptaddress() {
    return aptaddress;
}
public void setAptaddress(String aptaddress) {
    this.aptaddress = aptaddress;
}
public String getAptlonglat() {
    return aptlonglat;
}
public void setAptlonglat(String aptlonglat) {
    this.aptlonglat = aptlonglat;
}
public String getAptdetails() {
    return aptdetails;
}
public void setAptdetails(String aptdetails) {
    this.aptdetails = aptdetails;
}
public int getId() {
    return id;
}
public void setId(int id) {
    this.id = id;
}


}

【问题讨论】:

标签: spring spring-boot


【解决方案1】:

User 实体类中的更改有时可能无法准确反映您的数据库架构。您可以尝试以下解决方案之一:

1.通过添加 AUTO_INCREMENT 属性手动更新您的数据库架构

ALTER TABLE `user` CHANGE COLUMN `id` `id` INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT;

2。删除数据库中的用户表,然后重新运行应用程序

确保将spring.jpa.hibernate.ddl-auto 设置为createupdate。如果您使用嵌入式/内存数据库(如 H2 数据库),则默认值为 none

Spring Data JPA的这个配置会将Hibernate的hibernate.hbm2ddl.auto设置为设置值。在我们的例子中,它是createupdate

您可以在以下文章和文档中了解更多相关信息。
Spring Boot reference - Database Initialization
What are the possible values of the Hibernate hbm2ddl.auto configuration and what do they do

在生产中,我建议您不要使用此选项,而是使用LiquibaseFlyway 之类的数据库迁移工具,并将spring.jpa.hibernate.ddl-auto 配置保留为none

更多关于此的阅读Hibernate: hbm2ddl.auto=update in production?

【讨论】:

  • create 对我有用,谢谢!
【解决方案2】:

您应该删除现有数据库并重新生成它,因为有时通过模型完成的更改无法正确反映在数据库中。在重新生成数据库时,您可以使用 SchemaExport 构建它。

【讨论】:

    【解决方案3】:

        @Column(name = "apttitle")
        private String apttitle="default";
    

    工作?

    【讨论】:

      猜你喜欢
      • 2018-03-07
      • 1970-01-01
      • 1970-01-01
      • 2016-03-06
      • 2019-03-22
      • 2013-05-20
      • 2011-11-24
      • 2019-02-15
      • 2015-01-11
      相关资源
      最近更新 更多