IT

최대 포맷 모드 : "필드 'id'에 나열이 없습니다"

lottoking 2020. 7. 22. 07:49
반응형

최대 포맷 모드 : "필드 'id'에 나열이 없습니다"


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)되지 않음

해결 : 데이터베이스를 다시 작성하면 문제가 해결되었습니다.


모든 모델이나 ORM에 대한 변경 사항은 실행할 경우에도 반영되지 않을 수 있습니다 SchemaUpdate.

오류가 합당한다고 설명이없는 것 같으면 데이터베이스를 다시 작성하여 스캐 폴딩하십시오 SchemaExport.


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

}


hbm2ddl 속성에서 업데이트를 업데이트합니다. 테이블을 향수 수 있도록 변경하고 작성 업데이트하십시오.

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

그것은 나를 위해 일했다.


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

@GeneratedValue(strategy=GenerationType.IDENTITY)

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

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

@Constraints.Required
public String contents;

위의 구문은 Hibernate를 JPA 2.0 사용하여 MySQL에서 테이블을 생성하는 데입니다.


나는 같은 문제가 있었다. 외래 키 주석을 사용하여 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로 설정해야합니다.


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


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

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

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

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


나는이 문제가 있었다. 내 실수는 삽입 가능하고 업데이트 가능한 파일을 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;

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


위에서 언급 한 것 외에도이 예제와 같이 AUTO INCREMENT 를 만들기 위해 SQL 테이블을 생성하는 동안 잊지 마십시오.

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

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


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


나는 같은 문제가 있었다. 나는 조인 테이블을 사용하고 있었고 행 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;
    

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

예 : attribute_id NOT NULL BIGINT(20),attributeId NOT NULL BIGINT(20),

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


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


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

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

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

,catalog="databasename"

제 경우에는 문제가되는 테이블과 문제의 "id"필드를 변경하여 AUTO_INCREMENT로 만들었습니다. 배포 시간에 "AUTO_INCREMENT"로 만들지 않은 이유를 알아 내야하므로 혼자서해야합니다!


이것에 대해 :

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

도움이 되었기를 바랍니다.


Long객체 유형을 long기본 유형 으로 변경하십시오 (기본 유형을 사용하는 것이 괜찮은 경우).

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


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


주석 GenerationType.IDENTITY에서 선언하지 않았기 때문에 "필드 'id'에는 기본값이 없습니다 GeneratedValue."

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

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


hashCode()엔티티 빈 클래스에 메서드 추가 하고 다시 시도하십시오.

참고 URL : https://stackoverflow.com/questions/804514/hibernate-field-id-doesnt-have-a-default-value

반응형