Mam do czynienia z prostym problemem związanym z Hibernacją, ale nie mogę go rozwiązać (niedostępność forów Hibernate z pewnością nie pomaga).
Mam prostą klasę, którą chciałbym wytrwać, ale wciąż otrzymuję:
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 ]
Odpowiedni kod dla utrwalonej klasy to:
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;
}
}
A rzeczywisty działający kod jest po prostu prosty:
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();
}
Wypróbowałem kilka „strategii” w GeneratedValue
adnotacji, ale to po prostu nie działa. Inicjalizacja id
też nie pomaga! (np Long id = 20L
.).
Czy ktoś mógłby rzucić trochę światła?
EDYCJA 2: potwierdzona: mieszanie się z nim @GeneratedValue(strategy = GenerationType.XXX)
nie rozwiązuje problemu
ROZWIĄZANE: odtworzenie bazy danych rozwiązało problem
java
hibernate
jpa
persistence
André Chalella
źródło
źródło
GenerationType
się@GeneratedValue
odIDENTITY
celuAUTO
i pracował dla mnie. Możesz również ustawić właściwość automatycznego zwiększania wartości w MySQL.Odpowiedzi:
Czasami zmiany wprowadzone w modelu lub w ORM mogą nie odzwierciedlać dokładnie w bazie danych nawet po wykonaniu
SchemaUpdate
.Jeśli błąd faktycznie wydaje się nie mieć sensownego wyjaśnienia, spróbuj odtworzyć bazę danych (lub przynajmniej utworzyć nową) i zbudować ją za pomocą
SchemaExport
.źródło
SET foreign_key_checks = 0;
jest twoim przyjacielem. Po prostu pamiętaj,SET foreign_key_checks = 1;
kiedy skończysz.Jeśli chcesz, aby MySQL automatycznie tworzył klucze podstawowe, musisz to powiedzieć podczas tworzenia tabeli. Nie musisz tego robić w Oracle.
Na kluczu podstawowym musisz podać
AUTO_INCREMENT
. Zobacz poniższy przykład.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;
Oto Jednostka
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; } }
źródło
musisz używać aktualizacji w swojej właściwości hbm2ddl. wprowadź zmiany i zaktualizuj go, aby utworzyć, aby mógł utworzyć tabelę.
<property name="hbm2ddl.auto">create</property>
U mnie to zadziałało.
źródło
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id;
A z wartościącreate
wehbm2ddl.auto
właściwości zmiany zastosowane w moim schemacie bazy danych. Wielkie dzięki ....Spójrz na
GeneratedValue
strategię firmy. Zazwyczaj wygląda to tak:@GeneratedValue(strategy=GenerationType.IDENTITY)
źródło
Ręczne usunięcie tabeli z bazy danych i ponowne uruchomienie aplikacji zadziałało. W moim przypadku tabela nie została utworzona poprawnie (z ograniczeniami).
źródło
Miałem ten problem. Mój błąd polegał na tym, że ustawiłem pola do wstawienia i aktualizowalne jako fałszywe i próbowałem ustawić pole w żądaniu. To pole jest ustawione jako NON NULL w DB.
@ManyToOne @JoinColumn(name="roles_id", referencedColumnName = "id", insertable = false, updatable = false, nullable=false) @JsonBackReference private Role role;
Później zmieniłem to na - insertable = true, updatable = true
@ManyToOne @JoinColumn(name="roles_id", referencedColumnName = "id", insertable = true, updatable = true, nullable=false) @JsonBackReference //@JsonIgnore private Role role;
Później zadziałało doskonale.
źródło
Przyjechałem tu z powodu komunikatu o błędzie, okazuje się, że miałem dwie tabele o tej samej nazwie.
źródło
Inną sugestią jest sprawdzenie, czy używasz prawidłowego typu dla pola generowanego automatycznie. Pamiętaj, że nie działa z String, ale działa z Long:
@Id @GeneratedValue(strategy=GenerationType.AUTO) public Long id; @Constraints.Required public String contents;
Powyższa składnia działała przy generowaniu tabel w MySQL przy użyciu Hibernate jako dostawcy JPA 2.0.
źródło
Miałem ten sam problem. Znalazłem samouczek Hibernate One-To-One Mapping Example using Foreign key Adnotation i postępowałem zgodnie z nim krok po kroku, jak poniżej:
Utwórz tabelę bazy danych za pomocą tego skryptu:
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) );
Oto jednostki z powyższymi tabelami
@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; }
Problem został rozwiązany.
Uwaga: klucz podstawowy musi być ustawiony na AUTO_INCREMENT
źródło
Po prostu dodaj ograniczenie niezerowe
Miałem ten sam problem. Właśnie dodałem ograniczenie niezerowe w mapowaniu XML. Zadziałało
<set name="phone" cascade="all" lazy="false" > <key column="id" not-null="true" /> <one-to-many class="com.practice.phone"/> </set>
źródło
Może to jest problem ze schematem tabeli. upuść tabelę i ponownie uruchom aplikację.
źródło
Oprócz tego, co zostało wspomniane powyżej, nie zapomnij podczas tworzenia tabeli sql, aby wykonać AUTO INCREMENT, jak w tym przykładzie
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 );
źródło
Sprawdź, czy wartość domyślna dla identyfikatora kolumny w konkretnej tabeli. Jeśli nie ustawia jej jako domyślnej
źródło
Miałem ten sam problem. Używałem tabeli łączenia i wszystkiego, co miałem z polem id wiersza i dwoma kluczami obcymi. Nie znam dokładnej przyczyny, ale wykonałem następujące czynności
Upewnij się, że mam metody hashcode i equals
@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;
źródło
Ten sam wyjątek został zgłoszony, jeśli tabela DB miała starą nieusuniętą kolumnę.
Na przykład:
attribute_id NOT NULL BIGINT(20),
iattributeId NOT NULL BIGINT(20),
Po usunięciu atrybutu not used, w moim przypadku contractId , problem został rozwiązany.
źródło
Przydarzyło mi się to w
@ManyToMany
związku. Dodałem adnotację do jednego z pól w relacji z@JoinTable
, usunąłem to imappedBy
zamiast tego użyłem atrybutu na @ManyToMany.źródło
Wypróbowałem kod iw moim przypadku poniższy kod rozwiązuje problem. Nie ustaliłem poprawnie schematu
@Entity @Table(name="table" ,catalog="databasename" )
Spróbuj dodać
,catalog="databasename"
to samo, co ja.,catalog="databasename"
źródło
W moim przypadku zmieniłem tabele naruszające i pole „id”, o którym mowa, zrobiłem to AUTO_INCREMENT, nadal muszę dowiedzieć się, dlaczego w czasie wdrażania nie robiło to „AUTO_INCREMENT”, więc muszę to zrobić sam!
źródło
A co z tym:
<set name="fieldName" cascade="all"> <key column="id" not-null="true" /> <one-to-many class="com.yourClass"/> </set>
Mam nadzieję, że Ci to pomoże.
źródło
Spróbuj zmienić
Long
typ obiektu nalong
pierwotny (jeśli używanie prymitywów jest dla ciebie w porządku).Miałem ten sam problem i pomogła mi zmiana typu.
źródło
Miałem ten problem, przez pomyłkę umieściłem
@Transient
adnotację powyżej tego konkretnego atrybutu. W moim przypadku ten błąd ma sens.źródło
„Pole„ id ”nie ma wartości domyślnej”, ponieważ nie zostało zadeklarowane
GenerationType.IDENTITY
wGeneratedValue
Adnotacji.@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id;
źródło
Ten problem jest spowodowany tym, że czasami trzeba ponownie zaktualizować / utworzyć bazę danych lub czasami, jeśli dodano pole w tabeli db, ale nie klasę jednostki, nie można wstawić żadnej wartości null ani zera, więc pojawił się ten błąd. Sprawdź więc zarówno klasę side.Db, jak i Entity.
źródło
Gdy pole nie dopuszcza wartości null, wymaga określenia wartości domyślnej podczas tworzenia tabeli. Ponownie utwórz tabelę z prawidłowo zainicjowaną funkcją AUTO_INCREMENT, aby DB nie wymagał wartości domyślnej, ponieważ wygeneruje ją samodzielnie i nigdy nie ustawi tam wartości 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
źródło
Mam taki błąd w sql w chmurze GCP, gdy pole modelu nie pasuje do prawidłowego pola tabeli w db. Przykład: gdy w polu modelu znajduje się
fieldName
tabela w db powinna mieć pole
field_name
Naprawianie nazwy pola tabeli tabeli pomogło mi.źródło
Dodaj metodę
hashCode()
do klasy Entity Bean i spróbuj ponownieźródło