휴지 상태: "필드 '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개의 외부 키가 있는 것이 전부였습니다.정확한 원인은 알 수 없지만 다음과 같이 했습니다.
- 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),
미사용 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.IDENTITY
GeneratedValue
주석
@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
'programing' 카테고리의 다른 글
"new Object()"와 객체 리터럴 표기법의 차이점은 무엇입니까? (0) | 2023.01.20 |
---|---|
& & 로직 및 | 로직테이블의 True와 False (0) | 2023.01.20 |
PHP 알림을 해제하려면 어떻게 해야 합니까? (0) | 2023.01.20 |
안드로이드 캔버스에 채워진 삼각형을 그리는 방법은? (0) | 2023.01.20 |
PHP shell_exec() vs exec() (0) | 2023.01.20 |