【问题标题】:Hibernate: "Field 'id' doesn't have a default value"休眠:“字段 'id' 没有默认值”
【发布时间】:2010-10-22 17:10:29
【问题描述】:

我正面临一个我认为是 Hibernate 的简单问题,但无法解决(无法访问 Hibernate 论坛当然无济于事)。

我有一个简单的课程我想坚持,但要继续学习:

SEVERE: Field 'id' doesn't have a default value
Exception in thread "main" org.hibernate.exception.GenericJDBCException: could not insert: [hibtest.model.Mensagem]
    at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
    [ a bunch more ]
Caused by: java.sql.SQLException: Field 'id' doesn't have a default value
    [ a bunch more ]

持久化类的相关代码为:

package hibtest.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Mensagem  {
    protected Long id;

    protected Mensagem() { }

    @Id
    @GeneratedValue
    public Long getId() {
        return id;
}

    public Mensagem setId(Long id) {
        this.id = id;
        return this;
    }
}

而实际运行的代码很简单:

SessionFactory factory = new AnnotationConfiguration()
    .configure()
    .buildSessionFactory();

{
    Session session = factory.openSession();
    Transaction tx = session.beginTransaction();

    Mensagem msg = new Mensagem("YARR!");

    session.save(msg);

    tx.commit();
    session.close();
}

我在GeneratedValue 注释中尝试了一些“策略”,但它似乎不起作用。初始化id 也无济于事! (例如Long id = 20L)。

谁能解释一下?

编辑 2: 确认:搞乱@GeneratedValue(strategy = GenerationType.XXX) 并不能解决问题

已解决:重新创建数据库解决了问题

【问题讨论】:

  • 使用String的构造函数的来源是什么?
  • 对不起,我省略了。只需使用传递的值初始化一个字符串字段。
  • 如何在数据库端生成 ID?
  • 谢谢!在更改策略时,从未想过需要重新创建数据库。 :-)
  • 我将@GeneratedValue 中的GenerationTypeIDENTITY 更改为AUTO,它对我有用。此外,您可以在 MySQL 中设置自动增量属性。

标签: java hibernate jpa persistence


【解决方案1】:

有时,即使在执行SchemaUpdate 之后,对模型或 ORM 所做的更改也可能无法准确反映在数据库中。

如果错误似乎缺乏合理的解释,请尝试重新创建数据库(或至少创建一个新数据库)并使用SchemaExport 构建它。

【讨论】:

  • 在许多情况下,这个问题也可以通过删除有问题的表(或表)来解决,假设 Hibernate 设置为自动创建/管理 DB 模式。要从托管模式中删除表,SET foreign_key_checks = 0; 是您的朋友。完成后一定要SET foreign_key_checks = 1;
  • 我遇到了同样的问题并尝试使用您的 ans 但再次遇到同样的错误我做错了什么我不知道......我正在使用 mysql 数据库。
【解决方案2】:

如果您希望 MySQL 自动生成主键,那么您必须在创建表时告诉它。您不必在 Oracle 中执行此操作。

在主键上,您必须包含AUTO_INCREMENT。请参阅下面的示例。

CREATE TABLE `supplier`  
(  
  `ID` int(11) NOT NULL **AUTO_INCREMENT**,  
  `FIRSTNAME` varchar(60) NOT NULL,  
  `SECONDNAME` varchar(100) NOT NULL,  
  `PROPERTYNUM` varchar(50) DEFAULT NULL,  
  `STREETNAME` varchar(50) DEFAULT NULL,  
  `CITY` varchar(50) DEFAULT NULL,  
  `COUNTY` varchar(50) DEFAULT NULL,  
  `COUNTRY` varchar(50) DEFAULT NULL,  
  `POSTCODE` varchar(50) DEFAULT NULL,  
  `HomePHONENUM` bigint(20) DEFAULT NULL,  
  `WorkPHONENUM` bigint(20) DEFAULT NULL,  
  `MobilePHONENUM` bigint(20) DEFAULT NULL,  
  `EMAIL` varchar(100) DEFAULT NULL,  
  PRIMARY KEY (`ID`)  
) 

ENGINE=InnoDB DEFAULT CHARSET=latin1;  

这是实体

package com.keyes.jpa;  

import java.io.Serializable;
import javax.persistence.*;
import java.math.BigInteger;

/**
 * The persistent class for the parkingsupplier database table.
 * 
 */
@Entity
@Table(name = "supplier")
public class supplier implements Serializable
{
  private static final long serialVersionUID = 1L;

  @Id
  **@GeneratedValue(strategy = GenerationType.IDENTITY)**
  @Column(name = "ID")
  private long id;

  @Column(name = "CITY")
  private String city;

  @Column(name = "COUNTRY")
  private String country;

  @Column(name = "COUNTY")
  private String county;

  @Column(name = "EMAIL")
  private String email;

  @Column(name = "FIRSTNAME")
  private String firstname;

  @Column(name = "HomePHONENUM")
  private BigInteger homePHONENUM;

  @Column(name = "MobilePHONENUM")
  private BigInteger mobilePHONENUM;

  @Column(name = "POSTCODE")
  private String postcode;

  @Column(name = "PROPERTYNUM")
  private String propertynum;

  @Column(name = "SECONDNAME")
  private String secondname;

  @Column(name = "STREETNAME")
  private String streetname;

  @Column(name = "WorkPHONENUM")
  private BigInteger workPHONENUM;

  public supplier()
  {
  }

  public long getId()
  {
    return this.id;
  }

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

  public String getCity()
  {
    return this.city;
  }

  public void setCity(String city)
  {
    this.city = city;
  }

  public String getCountry()
  {
    return this.country;
  }

  public void setCountry(String country)
  {
    this.country = country;
  }

  public String getCounty()
  {
    return this.county;
  }

  public void setCounty(String county)
  {
    this.county = county;
  }

  public String getEmail()
  {
    return this.email;
  }

  public void setEmail(String email)
  {
    this.email = email;
  }

  public String getFirstname()
  {
    return this.firstname;
  }

  public void setFirstname(String firstname)
  {
    this.firstname = firstname;
  }

  public BigInteger getHomePHONENUM()
  {
    return this.homePHONENUM;
  }

  public void setHomePHONENUM(BigInteger homePHONENUM)
  {
    this.homePHONENUM = homePHONENUM;
  }

  public BigInteger getMobilePHONENUM()
  {
    return this.mobilePHONENUM;
  }

  public void setMobilePHONENUM(BigInteger mobilePHONENUM)
  {
    this.mobilePHONENUM = mobilePHONENUM;
  }

  public String getPostcode()
  {
    return this.postcode;
  }

  public void setPostcode(String postcode)
  {
    this.postcode = postcode;
  }

  public String getPropertynum()
  {
    return this.propertynum;
  }

  public void setPropertynum(String propertynum)
  {
    this.propertynum = propertynum;
  }

  public String getSecondname()
  {
    return this.secondname;
  }

  public void setSecondname(String secondname)
  {
    this.secondname = secondname;
  }

  public String getStreetname()
  {
    return this.streetname;
  }

  public void setStreetname(String streetname)
  {
    this.streetname = streetname;
  }

  public BigInteger getWorkPHONENUM()
  {
    return this.workPHONENUM;
  }

  public void setWorkPHONENUM(BigInteger workPHONENUM)
  {
    this.workPHONENUM = workPHONENUM;
  }

}

【讨论】:

  • 我们需要将主键设为自增。进行更改后,我的问题得到了解决
【解决方案3】:

看看GeneratedValue的策略。它通常看起来像:

@GeneratedValue(strategy=GenerationType.IDENTITY)

【讨论】:

  • 只是建议这个,尝试使用它而不是 .AUTO。
  • 我明天必须检查一下,但我几乎可以肯定这不会解决它。我看到很多使用 GenerationType.AUTO 的 ID 键。无论如何,我一定会确保明天测试它。
【解决方案4】:

您必须在 hbm2ddl 属性中使用更新。进行更改并将其更新为 Create 以便它可以创建表。

<property name="hbm2ddl.auto">create</property>

它对我有用。

【讨论】:

  • 这对我有用。 Hibernate + Derby DB @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; 并使用 hbm2ddl.auto 属性中的值 create 将更改应用于我的数据库模式。非常感谢....
【解决方案5】:

手动从数据库中删除表,然后重新运行应用程序对我有用。在我的情况下,我猜表没有正确创建(有约束)。

【讨论】:

  • 很好的解决方案。没有这么想。谢谢
  • 当我们对 Id 列或 Generation 类型进行任何更改时,我们应该这样做
【解决方案6】:

我遇到了这个问题。我的错误是我将可插入和可更新的文件设置为 false,并试图在请求中设置该字段。该字段在 DB 中设置为 NON NULL。

@ManyToOne
@JoinColumn(name="roles_id",  referencedColumnName = "id", insertable = false, updatable = false, nullable=false)
@JsonBackReference
private Role role;

后来我改成了--insertable = true, updatable = true

@ManyToOne
@JoinColumn(name="roles_id",  referencedColumnName = "id", insertable = true, updatable = true, nullable=false)
@JsonBackReference
//@JsonIgnore
private Role role;

后来效果很好。

【讨论】:

  • 可更新默认为真​​
【解决方案7】:

我是因为错误信息才来到这里的,原来我有两个同名的表。

【讨论】:

  • 同样的事情发生在我身上:MySQL 工作台只显示一个“用户”表,但是,在我删除数据库中的所有表后,它突然显示另一个以前不可见的“用户”表...
【解决方案8】:

另一个建议是检查您是否为自动生成的字段使用了有效的类型。请记住,它不适用于 String,但它适用于 Long:

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public Long id;

@Constraints.Required
public String contents;

上述语法适用于使用 Hibernate 作为 JPA 2.0 提供程序在 MySQL 中生成表。

【讨论】:

  • 将字符串更改为 Long 为我解决了这个问题。谢谢
【解决方案9】:

我遇到了同样的问题。我找到了教程Hibernate One-To-One Mapping Example using Foreign key Annotation 并按照如下步骤逐步进行:

使用此脚本创建数据库表:

create table ADDRESS (
   id INT(11) NOT NULL AUTO_INCREMENT,
   street VARCHAR(250) NOT NULL,
   city  VARCHAR(100) NOT NULL,
   country  VARCHAR(100) NOT NULL,
   PRIMARY KEY (id)
);

create table STUDENT (
    id            INT(11) NOT NULL AUTO_INCREMENT, 
    name          VARCHAR(100) NOT NULL, 
    entering_date DATE NOT NULL, 
    nationality   TEXT NOT NULL, 
    code          VARCHAR(30) NOT NULL,
    address_id INT(11) NOT NULL,
    PRIMARY KEY (id),
    CONSTRAINT student_address FOREIGN KEY (address_id) REFERENCES ADDRESS (id)   
);

这是上面表格的实体

@Entity
@Table(name = "STUDENT")
public class Student implements Serializable {

    private static final long serialVersionUID = 6832006422622219737L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

 }

@Entity
@Table(name = "ADDRESS")
public class Address {

    @Id @GeneratedValue
    @Column(name = "ID")
    private long id;
}

问题已解决。

注意:主键必须设置为AUTO_INCREMENT

【讨论】:

    【解决方案10】:

    只需添加非空约束

    我遇到了同样的问题。我刚刚在 xml 映射中添加了非空约束。 成功了

    <set name="phone" cascade="all" lazy="false" > 
       <key column="id" not-null="true" />
       <one-to-many class="com.practice.phone"/>
    </set>
    

    【讨论】:

      【解决方案11】:

      这可能是表架构的问题。 删除表格并重新运行应用程序。

      【讨论】:

        【解决方案12】:

        除了上面提到的以外,不要忘记在创建sql表的时候像本例那样进行AUTO INCREMENT

        CREATE TABLE MY_SQL_TABLE (
        
          USER_ID INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
          FNAME VARCHAR(50) NOT NULL,
          LNAME VARCHAR(20) NOT NULL,
          EMAIL VARCHAR(50) NOT NULL
        );
        

        【讨论】:

          【解决方案13】:

          当您的字段不可为空时,它需要在创建表时指定默认值。重新创建一个正确初始化 AUTO_INCREMENT 的表,因此 DB 不需要默认值,因为它会自行生成它,并且永远不会在那里放置 NULL。

          CREATE TABLE Persons (
          Personid int NOT NULL AUTO_INCREMENT,
          LastName varchar(255) NOT NULL,
          FirstName varchar(255),
          Age int,
          PRIMARY KEY (Personid)
          

          );

          https://www.w3schools.com/sql/sql_autoincrement.asp

          【讨论】:

            【解决方案14】:

            请检查特定表中列 id 的默认值是否为默认值。如果不设为默认值

            【讨论】:

              【解决方案15】:

              我遇到了同样的问题。我正在使用一个连接表,而我所拥有的只有一个行 ID 字段和两个外键。我不知道确切的原因,但我做了以下操作

              1. 将 MySQL 升级到社区 5.5.13
              2. 重命名类和表
              3. 确保我有 hashcode 和 equals 方法

                @Entity 
                @Table(name = "USERGROUP")
                public class UserGroupBean implements Serializable {
                private static final long serialVersionUID = 1L;
                
                @Id
                @GeneratedValue(strategy=GenerationType.AUTO)
                @Column(name = "USERGROUP_ID")
                private Long usergroup_id;
                
                @Column(name = "USER_ID")   
                private Long user_id;
                
                @Column(name = "GROUP_ID")
                private Long group_id;
                

              【讨论】:

                【解决方案16】:

                如果数据库表有一个旧的未删除列,则会引发相同的异常。

                例如: attribute_id NOT NULL BIGINT(20),attributeId NOT NULL BIGINT(20),

                删除未使用的属性后,在我的例子中是 contractId,问题解决了。

                【讨论】:

                  【解决方案17】:

                  这发生在我的 @ManyToMany 关系中。我已经注释了与@JoinTable 关系中的一个字段,我删除了它并在@ManyToMany 上使用了mappedBy 属性。

                  【讨论】:

                  • 你能举个例子吗?
                  【解决方案18】:

                  我尝试了代码,在我的情况下,下面的代码解决了这个问题。我没有正确解决架构

                  @Entity
                      @Table(name="table"
                           ,catalog="databasename"
                        )
                  

                  请尝试像我一样添加,catalog="databasename"

                  ,catalog="databasename"
                  

                  【讨论】:

                    【解决方案19】:

                    就我而言, 我更改了有问题的表和有问题的字段“id”,我将其设置为 AUTO_INCREMENT,我仍然需要弄清楚为什么在部署时它没有设置为“AUTO_INCREMENT”,所以我必须自己做!

                    【讨论】:

                      【解决方案20】:

                      这个呢:

                      <set name="fieldName" cascade="all"> 
                         <key column="id" not-null="true" />
                         <one-to-many class="com.yourClass"/>
                      </set>
                      

                      希望对你有帮助。

                      【讨论】:

                        【解决方案21】:

                        尝试将Long 对象类型更改为long 原始类型(如果您可以使用原始类型)。

                        我遇到了同样的问题,更改类型对我有帮助。

                        【讨论】:

                          【解决方案22】:

                          我遇到了这个问题,我错误地将@Transient 注释放在该特定属性上方。就我而言,这个错误是有道理的。

                          【讨论】:

                            【解决方案23】:

                            “字段 'id' 没有默认值”,因为您没有在 GeneratedValue 注释中声明 GenerationType.IDENTITY

                            @Id
                            @GeneratedValue(strategy = GenerationType.IDENTITY)
                            private int id;
                            

                            【讨论】:

                              【解决方案24】:

                              这个问题是因为有时您需要再次更新/创建数据库,或者有时如果您在 db 表中添加了字段但没有在实体类中添加字段,则它无法插入任何空值或零,因此出现此错误。 所以检查 side.Db 和 Entity 类。

                              【讨论】:

                                【解决方案25】:

                                当模型字段与数据库中的正确表字段不匹配时,我在 GCP 云 sql 中遇到此类错误。 例子: 当在模型字段中是fieldName
                                数据库中的表应该有字段field_name 修复表字段名称对我有帮助。

                                【讨论】:

                                  【解决方案26】:

                                  我通过 @GeneratedValue(strategy = GenerationType.AUTO) 解决了 @GeneratedValue(strategy = GenerationType.IDENTITY)

                                  顺便说一句,我不需要把它创建,只是:

                                  spring.jpa.hibernate.ddl-auto: update
                                  

                                  【讨论】:

                                    【解决方案27】:

                                    hashCode() 方法添加到您的实体 Bean 类并重试

                                    【讨论】:

                                    • 您能解释一下原因吗?
                                    猜你喜欢
                                    • 2018-07-31
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 2014-11-09
                                    • 2015-07-19
                                    • 2013-07-26
                                    • 1970-01-01
                                    • 2020-09-14
                                    相关资源
                                    最近更新 更多