programing

휴지 상태: "필드 'id'에 기본값이 없습니다."

sourcetip 2023. 1. 20. 17:45
반응형

휴지 상태: "필드 'id'에 기본값이 없습니다."

Hibernate 포럼이 도달할 수 없는 것은 분명 도움이 되지 않는 단순한 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;
  }

}

, 그럼 ㄴㄴㄴ데를 한 번 보세요.GeneratedValue의 전략입니다.츠키다

@GeneratedValue(strategy=GenerationType.IDENTITY)

hbm2dl 속성에서 업데이트를 사용해야 합니다. 테이블을 생성할 수 있도록 변경하고 Create로 업데이트합니다.

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

그것은 나에게 효과가 있었다.

데이터베이스에서 테이블을 수동으로 삭제한 후 응용 프로그램을 다시 실행하는 것이 도움이 되었습니다.제 경우 표가 제대로 작성되지 않은 것 같습니다.

이런 문제가 있었어요.실수로 삽입 가능 및 업데이트 가능 파일을 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;

나중에 완벽하게 작동했어요.

오류 메시지 때문에 왔는데, 같은 이름의 테이블이 두 개 있었어요.

저도 같은 문제가 있었어요.Foreign주석을 사용하여 Hibernate One-to-One Mapping 예제 튜토리얼을 찾은 후 다음과 같이 단계별로 진행했습니다.

다음 스크립트를 사용하여 데이터베이스 테이블을 만듭니다.

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

자동 생성된 필드에 유효한 유형을 사용하고 있는지 확인하는 것도 좋습니다.String에서는 동작하지 않지만 Long에서는 동작합니다.

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

@Constraints.Required
public String contents;

위의 구문은 Hibernate를 JPA 2.0 공급자로 사용하여 MySQL에서 테이블을 생성하는 데 도움이 되었습니다.

null이 아닌 제약 조건만 추가합니다.

저도 같은 문제가 있었어요.xml 매핑에 not-null 제약조건을 추가했습니다.효과가 있었다

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

테이블 스키마의 문제일 수 있습니다.테이블을 삭제하고 어플리케이션을 재실행합니다.

위의 내용과 더불어 이 예시와 같이 sql 테이블을 생성하여 AUTO INCRECTURE를 만드는 것도 잊지 마십시오.

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

필드를 null로 할 수 없는 경우 테이블 작성 시 기본값을 지정해야 합니다.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

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

저도 같은 문제가 있었어요.조인 테이블을 사용하고 있었는데, 행 ID 필드와 2개의 외부 키가 있는 것이 전부였습니다.정확한 원인은 알 수 없지만 다음과 같이 했습니다.

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

미사용 Atribute를 삭제한 후, 제 경우는 contractId로 문제가 해결되었습니다.

일은 to this this런 a a this this this this this this 。@ManyToMany관계.저는 이 분야 중 하나에 주석을 달았습니다.@JoinTable하고, 「 」 「 」 「 」 「 」 를 mappedBy@ManyToMany는 @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을 사용법제 경우 이 오류는 일리가 있습니다.

'는 'id'를 선언하지기본값이 없습니다GenerationType.IDENTITYGeneratedValue주석

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

이 문제는 데이터베이스를 다시 업데이트/작성해야 하는 경우도 있고 엔티티 클래스가 아닌 db 테이블에 필드를 추가한 경우에도 늘 값 또는0 을 삽입할 수 없기 때문에 이 오류가 발생하기 때문입니다.그러니까 양쪽 다 확인해봐.DB 및 엔티티 클래스.

모델 필드가 db의 올바른 테이블 필드와 일치하지 않을 때 GCP cloud sql에서 이러한 오류가 발생했습니다.가 ": " " 인 경우fieldName
에는 필드 db가 .field_name테이블 필드 이름을 고친 것이 도움이 되었습니다.

@GeneratedValue(전략=GenerationType) 변경으로 해결했습니다.ID) by @GeneratedValue(전략 = GenerationType).자동)

그런데, 나는 그것을 창조하기 위해 넣을 필요가 없었다.

spring.jpa.hibernate.ddl-auto: update

데이터베이스 컬럼 타입을 변경했을 때 auto_increment를 추가하지 않았을 때도 같은 문제를 해결했습니다.alter table 명령어로 auto_increment를 다시 추가한 후(원래 테이블 작성과 같이) 동작했습니다.

제 경우 application.properties 파일에 다음 속성을 추가하지 않았습니다.

spring.jpa.database-platform = org.hibernate.dialect.MySQL5InnoDBDialect

그리고 엔티티 클래스의 Id 열에 다음 주석을 추가했습니다.

@GeneratedValue(strategy = GenerationType.IDENTITY)

그리고 이 추가 후 데이터 베이스에서 테이블을 수동으로 삭제하고 테이블에 대한 모든 기본 구속조건을 가진 새 테이블을 만드는 프로젝트를 다시 실행합니다.

스키마를 삭제하는 것은 매우 나쁜 제안입니다.문제가 있으니 찾아서 고치는 게 최선이에요.

Envers를 사용하고 있는 경우 엔트리가 갱신되었을 때의 감사 테이블이 생성됩니다.단, 이 감사테이블 자체는 갱신되지 않습니다.스키마가 갱신되었을 때 (적어도 ID와 그 관계)

방금 감사표를 편집해서 재산에 불쾌감을 줬어모든 것이 정상으로 돌아왔다.

문제의 원인을 찾으려면 application.properties 파일에서 다음 속성을 설정합니다.

spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

실행하려는 SQL이 표시되며 실제 문제에 대한 명확성이 제공되기를 바랍니다.

메서드 추가hashCode()엔티티 Bean 클래스로 이동하여 재시도합니다.

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

반응형