최대 포맷 모드 : "필드 '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 필드와 두 개의 외래 키를 사용했습니다. 정확한 원인은 모르지만 다음을 수행했습니다.
- MySQL을 커뮤니티 5.5.13으로 업그레이드
- 클래스 및 테이블 이름 변경
해시 코드와 같음 메서드가 있는지 확인하십시오.
@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
'IT' 카테고리의 다른 글
emacs 자바 확장 모드에서 들여 쓰기 너비를 변경하는 방법 (0) | 2020.07.23 |
---|---|
reStructuredText에서 강조 인라인 코드 (0) | 2020.07.22 |
미리 정의 된 Maven 속성 목록은 어디에 있습니까? (0) | 2020.07.22 |
행을 결합하는 부트 유효성 (행 범위) (0) | 2020.07.22 |
로직을 추가 할 MVC (Laravel) (0) | 2020.07.22 |