Hibernate: «Поле« id »не имеет значения по умолчанию»
Я сталкиваюсь с тем, что, по моему мнению, является простой проблемой с Hibernate, но не может ее решить (форумы Hibernate недостижимы, конечно, не помогают).
У меня есть простой class, который я бы хотел сохранить, но продолжаю:
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 ]
Соответствующий код для сохраненного classа:
- как создать составной первичный ключ (аннотация java persistence)
- Когда использовать EntityManager.find () vs EntityManager.getReference () с JPA
- Поставщик сущностей для EntityManager не указан
- Использование свойств javafx.beans в classах моделей
- Решить проблему Liby-Hibernate с помощью hibernate.enable_lazy_load_no_trans
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(); }
Я пробовал некоторые «страtagsи» в annotations GeneratedValue
но он просто не работает. Инициализация id
тоже не помогает! (например, Long id = 20L
).
Может ли кто-нибудь пролить свет?
EDIT 2: подтверждено: messing с @GeneratedValue(strategy = GenerationType.XXX)
не решает его
SOLVED: воссоздание базы данных позволило решить проблему
- Создание магазина JSON для iPhone
- Возможно ли отделить объект Hibernate, чтобы изменения объекта не были автоматически сохранены в базе данных?
- Создание глобально уникального идентификатора в Java
- Каковы различия между различными методами сохранения в Hibernate?
- Можно ли удалить ребенка из коллекции и решить проблемы в SaveChanges?
- Каков правильный путь для ссылки jar-файла в jpa persistence.xml в веб-приложении?
- Единица сохранения как RESOURCE_LOCAL или JTA?
Иногда изменения, внесенные в модель или в ORM, могут не точно отразиться на базе данных даже после выполнения SchemaUpdate
.
Если на самом деле на самом деле отсутствует разумное объяснение, попробуйте воссоздать базу данных (или, по крайней мере, создать новую), и SchemaExport
ее с помощью 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; } }
Взгляните на страtagsю GeneratedValue
. Обычно это выглядит примерно так:
@GeneratedValue(strategy=GenerationType.IDENTITY)
вы должны использовать обновление в свойстве hbm2ddl. внесите изменения и обновите их в Create, чтобы он мог создать таблицу.
create
Это сработало для меня.
Еще одно предложение – проверить, что вы используете действительный тип для автоматически генерируемого поля. Помните, что он не работает со строкой, но работает с Long:
@Id @GeneratedValue(strategy=GenerationType.AUTO) public Long id; @Constraints.Required public String contents;
Вышеупомянутый синтаксис работал для генерации таблиц в MySQL с использованием Hibernate в качестве поставщика JPA 2.0.
Я пришел сюда из-за сообщения об ошибке, оказалось, что у меня две таблицы с тем же именем.
Просто добавьте ненулевое ограничение
У меня такая же проблема. Я просто добавил ограничение null-null в xml-сопоставлении. Это сработало
У меня такая же проблема. Я нашел пример учебного примера Hibernate One-To-One Mapping с использованием Foreign Key Annotation и выполнил его шаг за шагом, как показано ниже:
Создайте таблицу базы данных с помощью этого скрипта:
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
Удаление таблицы из базы данных вручную, а затем повторное выполнение приложения сработало для меня. Думаю, в моем случае таблица не была создана должным образом (с ограничениями).
Проверьте, действительно ли значение по умолчанию для идентификатора столбца в таблице table.if не делает его по умолчанию
У меня такая же проблема. Я использовал таблицу соединений и все, что у меня было с полем id строки и двумя внешними ключами. Я не знаю точно вызванного, но я сделал следующее
- Модернизация MySQL до сообщества 5.5.13
- Переименуйте class и таблицу
-
Убедитесь, что у меня есть hashcode и 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;
Это же исключение было выбрано, если таблица БД имела старый неуправляемый столбец.
Например: attribute_id NOT NULL BIGINT(20),
и attributeId NOT NULL BIGINT(20),
После удаления неиспользуемого атрибута в моем случае contractId проблема была решена.
У меня была эта проблема, по ошибке у меня есть аннотация @Transient
над этим конкретным атрибутом. В моем случае эта ошибка имеет смысл.
Это случилось со мной с отношениями @ManyToMany
. Я аннотировал одно из полей в отношении с @JoinTable
, я удалил это и использовал атрибут mappedBy в @ManyToMany.
В дополнение к тому, что упоминалось выше, не забывайте при создании таблицы sql, чтобы сделать AUTO INCREMENT, как в этом примере
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"
Добавьте метод hashCode()
в свой объект Bean Class и повторите попытку