[java] 최대 절전 모드 : “필드 ‘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)


답변

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


답변

나는이 문제가 있었다. 내 실수는 삽입 가능하고 업데이트 가능한 제출을 거짓으로 설정하고 요청에서 필드를 설정하려고하는 것이 었습니다. 이 필드는 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;

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


답변

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