최대 절전 모드 : "필드 'id'에 기본값이 없습니다"


130

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을 사용하는 생성자의 소스는 무엇입니까?
— Michael Pralow

미안, 나는 그것을 생략했다. 전달 된 값으로 문자열 필드를 초기화하기 만하면됩니다.
— André Chalella 2009

1
데이터베이스 측에서 ID를 어떻게 생성합니까?
— James McMahon

5
고마워 ! 전략을 변경할 때 데이터베이스를 다시 만들어야한다는 생각은하지 않았습니다. :-)
— Jan Goyvaerts

1
나는 변경 GenerationType에 @GeneratedValue에서 IDENTITY에 AUTO그것은 나를 위해 일했습니다. 또한 MySQL에서 자동 증분 속성을 설정할 수 있습니다.
— Vishrant

답변:


113

때때로 모델이나 ORM에 대한 변경 사항은 실행 후에도 데이터베이스에 정확하게 반영되지 않을 수 있습니다 SchemaUpdate.

오류가 실제로 합리적인 설명이없는 것 같으면 데이터베이스를 다시 작성하거나 적어도 새 데이터베이스를 작성하여로 스캐 폴딩하십시오 SchemaExport.


13
대부분의 경우이 문제는 Hibernate가 DB 스키마를 자동으로 생성 / 관리하도록 설정되었다고 가정하면 문제가되는 테이블을 삭제함으로써 해결할 수 있습니다. 관리되는 스키마에서 테이블을 삭제하려면 SET foreign_key_checks = 0;친구입니다. SET foreign_key_checks = 1;완료되면 확인하십시오 .
— aroth

나는 같은 문제가 있고 당신의 ans와 함께 시도하지만 다시 내가 모르는 실수에 대해 같은 오류가 발생했습니다 ... 나는 mysql 데이터베이스를 사용하고 있습니다.
— Krunal Patel

56

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;
  }

}

13

hbm2ddl 속성에서 업데이트를 사용해야합니다. 테이블을 작성할 수 있도록 변경하고 작성으로 업데이트하십시오.

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

그것은 나를 위해 일했다.


1
그것은 나를 위해 일하고 있습니다. 최대 절전 모드 + Derby DB 속성 @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; 값 create을 사용하면 hbm2ddl.auto데이터베이스 스키마에 변경 사항이 적용됩니다. 감사합니다 ....
— Adam M. Gamboa G.

12

GeneratedValue의 전략을 살펴보십시오 . 일반적으로 다음과 같습니다.

@GeneratedValue(strategy=GenerationType.IDENTITY)

이것을 제안하기 위해 .AUTO 대신 이것을 사용해보십시오.
— James McMahon

내일 확인해야하지만 문제가 해결되지는 않을 것입니다. GenerationType.AUTO를 사용하여 많은 ID 키를 봅니다. 어쨌든, 나는 내일 그것을 테스트 할 것입니다.
— André Chalella 2009

확인 됨-도움이되지 않음
— André Chalella

6

데이터베이스에서 테이블을 수동으로 삭제 한 다음 응용 프로그램을 다시 실행하면 나에게 도움이되었습니다. 내 경우에는 테이블이 제대로 작성되지 않았습니다 (제약 조건 포함).


훌륭한 솔루션. 그렇게 생각하지 않았다. 감사합니다
— Meir

ID 열 또는 생성 유형을 변경할 때이 작업을 수행해야합니다.
— Jadda

5

나는이 문제가 있었다. 내 실수는 삽입 가능하고 업데이트 가능한 제출을 거짓으로 설정하고 요청에서 필드를 설정하려고하는 것이 었습니다. 이 필드는 DB에서 NON NULL로 설정됩니다.

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

나중에 변경했습니다-insertable = true, 업데이트 가능 = true

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

나중에 완벽하게 작동했습니다.


기본적으로 업데이트 가능
— Janac Meena

4

오류 메시지로 인해 여기에 왔으며 이름이 같은 두 개의 테이블이있는 것으로 나타났습니다.


어떻게 든 나에게 같은 일이 발생했습니다 : MySQL 워크 벤치는 하나의 '사용자'테이블을 보여 주었지만 데이터베이스의 모든 테이블을 삭제 한 후 갑자기 보이지 않는 다른 '사용자'테이블을 보여주었습니다 ...
— SND

3

다른 제안은 자동 생성 필드에 유효한 유형을 사용하는지 확인하는 것입니다. String에서는 작동하지 않지만 Long에서는 작동합니다.

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

@Constraints.Required
public String contents;

위 구문은 Hibernate를 JPA 2.0 제공자로 사용하여 MySQL에서 테이블을 생성하는 데 효과적이었습니다.


String을 Long으로 변경하면이 문제가 해결되었습니다. 감사합니다
— jlars62

3

나는 같은 문제가 있었다. 외래 키 주석을 사용하여 Hibernate 일대일 매핑 예제 자습서를 찾아서 다음과 같이 단계별로 수행했습니다.

이 스크립트를 사용하여 데이터베이스 테이블을 작성하십시오.

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로 설정해야합니다.


2

null이 아닌 제약 조건을 추가하십시오.

나는 같은 문제가 있었다. XML 매핑에 null이 아닌 제약 조건을 추가했습니다. 그것은 효과가 있었다

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

2

아마도 이것이 테이블 스키마의 문제 일 것입니다. 테이블을 삭제하고 애플리케이션을 다시 실행하십시오.


1

위에서 언급 한 것 외에도 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
);

0

특정 테이블의 열 ID에 대한 기본값이 기본값인지 확인하십시오.


0

나는 같은 문제가 있었다. 나는 조인 테이블을 사용하고 있었고 행 ID 필드와 두 개의 외래 키를 가지고있었습니다. 정확한 원인을 모르지만 다음을 수행했습니다.

  1. MySQL을 커뮤니티 5.5.13으로 업그레이드
  2. 클래스와 테이블 이름 바꾸기
  3. 내가 해시 코드를 가지고 있고 메소드와 동등한 지 확인하십시오

    @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;

0

DB 테이블에 이전의 제거되지 않은 열이있는 경우 동일한 예외가 발생했습니다.

예를 들면 다음 attribute_id NOT NULL BIGINT(20),과 같습니다. attributeId NOT NULL BIGINT(20),

사용하지 않는 속성을 제거한 후 내 경우 contractId 에서 문제가 해결되었습니다.


0

이것은 @ManyToMany관계 로 나에게 일어났다 . 와의 관계에서 필드 중 하나에 주석 을 달았습니다.이를 @JoinTable제거하고 mappedBy대신 @ManyToMany 의 속성을 사용했습니다 .


예를 들어 줄 수 있습니까?
— Malena T

0

나는 코드를 시도했고 내 경우에는 아래 코드가 문제를 해결합니다. 스키마를 올바르게 설정하지 않았습니다

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

,catalog="databasename" 내가했던 것과 같은 것을 추가 하십시오.

,catalog="databasename"

0

제 경우에는 문제가되는 테이블과 필드 "id"를 AUTO_INCREMENT로 변경했습니다. 배포 시간에 왜 "AUTO_INCREMENT"가 아닌 이유를 알아 내야하므로 직접해야합니다!


0

이건 어때?

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

도움이 되길 바랍니다.


0

Long객체 유형을 long기본 유형 으로 변경하십시오 (기본 유형을 사용하는 것이 좋습니다).

나는 같은 문제가 있었고 유형을 바꾸는 것이 나에게 도움이되었다.


0

실수 로이 @Transient특정 속성 위에 주석 을 배치했습니다 . 내 경우에는이 오류가 의미가 있습니다.


0

당신은 선언하지 않았기 때문에 '필드'ID는 '기본 값이없는 " GenerationType.IDENTITY의 GeneratedValue주석.

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

0

이 문제는 때로는 데이터베이스를 다시 업데이트 / 생성해야하거나 때로는 db 테이블에 필드를 추가했지만 엔티티 클래스가 아닌 경우 null 값 또는 0을 삽입 할 수 없으므로이 오류가 발생하기 때문입니다. 따라서 side.Db 및 Entity 클래스를 모두 확인하십시오.


0

필드가 널 입력 가능하지 않은 경우 테이블 작성시 기본값을 지정해야합니다. 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


0

모델 필드가 DB의 올바른 테이블 필드와 일치하지 않으면 GCP 클라우드 SQL에서 이러한 오류가 발생했습니다. 예 : 모델 필드가 fieldName
db 인 테이블 인 경우 필드 field_name 수정 테이블 필드 이름이 도움이되어야합니다.


-1

hashCode()Entity Bean 클래스에 메소드 를 추가 하고 다시 시도하십시오.


이유를 설명해 주시겠습니까?
— Raja Anbazhagan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.