최대 절전 모드 : "필드 '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에서 IDENTITYAUTO그것은 나를 위해 일했습니다. 또한 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.IDENTITYGeneratedValue주석.

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