Я столкнулся с простой проблемой с 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)
не решить
РЕШЕНО: воссоздание базы данных решило проблему
java
hibernate
jpa
persistence
Андре Чалелла
источник
источник
GenerationType
в@GeneratedValue
сIDENTITY
кAUTO
и он работал на меня. Кроме того, в MySQL можно установить свойство автоматического увеличения.Ответы:
Иногда изменения, внесенные в модель или в ORM, могут неточно отражаться в базе данных даже после выполнения
SchemaUpdate
.Если кажется, что ошибке действительно не хватает разумного объяснения, попробуйте воссоздать базу данных (или, по крайней мере, создать новую) и обработать ее с помощью
SchemaExport
.источник
SET foreign_key_checks = 0;
- ваш друг. Просто не забудьте,SET foreign_key_checks = 1;
когда закончите.Если вы хотите, чтобы MySQL автоматически создавал первичные ключи, вы должны указать это при создании таблицы. В Oracle этого делать не нужно.
На первичном ключе надо включить
AUTO_INCREMENT
. См. Пример ниже.Вот сущность
источник
вы должны использовать update в свойстве hbm2ddl. внесите изменения и обновите его до Create, чтобы он мог создать таблицу.
У меня это сработало.
источник
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id;
И со значениемcreate
вhbm2ddl.auto
свойстве изменения, примененные в моей схеме базы данных. Большое спасибо ....Взгляните на
GeneratedValue
стратегию России. Обычно это выглядит примерно так:источник
Удаление таблицы из базы данных вручную и повторный запуск приложения сработали для меня. Думаю, в моем случае таблица была создана неправильно (с ограничениями).
источник
У меня была эта проблема. Моя ошибка заключалась в том, что я установил для вставляемых и обновляемых полей значение false и пытался установить поле в запросе. Это поле установлено как NON NULL в БД.
Позже я изменил его на - insertable = true, updatable = true
Позже это сработало отлично.
источник
Я пришел сюда из-за сообщения об ошибке, оказалось, у меня было две таблицы с одинаковым именем.
источник
Другое предложение - проверить, что вы используете допустимый тип для автоматически созданного поля. Помните, что это не работает со String, но работает с Long:
Вышеупомянутый синтаксис работал для создания таблиц в MySQL с использованием Hibernate в качестве поставщика JPA 2.0.
источник
У меня такая же проблема. Я нашел учебник Пример сопоставления Hibernate One-To-One с использованием аннотации внешнего ключа и следил за ним шаг за шагом, как показано ниже:
Создайте таблицу базы данных с помощью этого скрипта:
Вот сущности с приведенными выше таблицами
Проблема решена.
Примечание: первичный ключ должен быть установлен на AUTO_INCREMENT.
источник
Просто добавьте ненулевое ограничение
У меня такая же проблема. Я просто добавил ограничение на ненулевое значение в сопоставление xml. Это сработало
источник
Возможно, в этом проблема схемы таблицы. отбросьте таблицу и перезапустите приложение.
источник
В дополнение к тому, что упомянуто выше, не забудьте при создании таблицы sql сделать АВТО УВЕЛИЧЕНИЕ, как в этом примере
источник
Пожалуйста, проверьте, установлено ли значение по умолчанию для идентификатора столбца в конкретной таблице. Если не использовать его по умолчанию
источник
У меня такая же проблема. Я использовал таблицу соединений и все, что у меня было, с полем идентификатора строки и двумя внешними ключами. Я не знаю точной причины, но сделал следующее
Убедитесь, что у меня есть методы hashcode и equals
источник
То же исключение возникало, если в таблице БД был старый неудаленный столбец.
Например:
attribute_id NOT NULL BIGINT(20),
иattributeId NOT NULL BIGINT(20),
После удаления неиспользуемого атрибута в моем случае contractId проблема была решена.
источник
Это случилось со мной в
@ManyToMany
отношениях. Я аннотировал одно из полей в отношении@JoinTable
, я удалил его иmappedBy
вместо этого использовал атрибут @ManyToMany.источник
Я попробовал код, и в моем случае приведенный ниже код решает проблему. Я неправильно установил схему
Пожалуйста, попробуйте добавить
,catalog="databasename"
то же, что и я.источник
В моем случае я изменил эти оскорбительные таблицы и поле «id», о котором идет речь. Я сделал это AUTO_INCREMENT, мне все еще нужно выяснить, почему во время развертывания он не делал это «AUTO_INCREMENT», так что я должен сделать это сам!
источник
Как насчет этого:
Надеюсь, это тебе поможет.
источник
Попробуйте изменить
Long
тип объекта наlong
примитивный (если вам подходит использование примитивов).У меня была та же проблема, и смена шрифта помогла мне.
источник
У меня была эта проблема, я по ошибке разместил
@Transient
аннотацию над этим конкретным атрибутом. В моем случае эта ошибка имеет смысл.источник
«Поле 'id' не имеет значения по умолчанию», потому что вы не объявили его
GenerationType.IDENTITY
вGeneratedValue
аннотации.источник
Эта проблема возникает из-за того, что иногда вам нужно снова обновить / создать базу данных или иногда, если вы добавили поле в таблицу db, но не класс сущности, тогда он не может вставить какое-либо нулевое значение или ноль, поэтому возникла эта ошибка. Поэтому проверьте оба класса side.Db и Entity.
источник
Если ваше поле не допускает значения NULL, при создании таблицы необходимо указать значение по умолчанию. Воссоздайте таблицу с правильно инициализированным AUTO_INCREMENT, чтобы БД не требовало значения по умолчанию, поскольку оно будет генерировать его само и никогда не помещает туда NULL.
);
https://www.w3schools.com/sql/sql_autoincrement.asp
источник
У меня такая ошибка в GCP cloud sql, когда поле модели не соответствует правильному полю таблицы в db. Пример: когда в поле модели есть
fieldName
таблица, в базе данных должно быть поле
field_name
Исправление имени поля таблицы мне помогло.источник
Добавьте метод
hashCode()
в свой класс Entity Bean и повторите попытку.источник