문제

나는 최대 절전 모드의 간단한 문제라고 생각하는 것에 직면하고 있지만 그것을 해결할 수는 없습니다 (교동 할 수없는 최대 절전 모드 포럼은 확실히 도움이되지 않습니다).

지속하고 싶은 간단한 수업이 있지만 계속 받고 있습니다.

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이 기본 키를 자동으로 생성하려면 테이블을 만들 때 알려야합니다. 당신은 오라클에서 이것을 할 필요가 없습니다.

기본 키에는 포함해야합니다 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)

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

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

@Constraints.Required
public String contents;

위의 구문은 Hibernate를 JPA 2.0 제공 업체로 사용하여 MySQL에서 테이블을 생성하는 데 작용했습니다.

나는 같은 문제가 있었다. 튜토리얼을 찾았습니다 외국 키 주석을 사용하여 일대일 매핑 예제 아래와 같이 단계로 이어졌습니다.

이 스크립트로 데이터베이스 테이블을 만듭니다.

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

오류 메시지 때문에 여기에 왔는데, 같은 이름의 테이블이 두 개 있다는 것이 밝혀졌습니다.

널없는 제약 조건을 추가하십시오

나는 같은 문제가 있었다. 방금 XML 매핑에 널없는 제약 조건을 추가했습니다. 그것은 효과가있었습니다

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

데이터베이스에서 수동으로 테이블을 떨어 뜨린 다음 응용 프로그램을 다시 실행하면 나에게 효과가있었습니다. 내 경우에는 테이블이 제대로 생성되지 않았습니다 (제약 조건).

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

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

나중에 나는 그것을 삽입 가능한 = true, updatable = true로 변경했습니다.

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

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

특정 표에서 열 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),

사용되지 않은 속성을 제거한 후, 내 경우에는 계약, 문제는 해결되었습니다.

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

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

코드를 시도했고 내 경우 아래 코드는 문제를 해결합니다. 스키마를 올바르게 해결하지 못했습니다

@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 해당 특정 속성 위의 주석. 제 경우에는이 오류가 의미가 있습니다.

메소드를 추가하십시오 hashCode() 엔티티 콩 클래스에 다시 시도하십시오

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top