Hibernate: "Поле 'id' не имеет значения по умолчанию" - PullRequest
106 голосов
/ 30 апреля 2009

Я столкнулся с простой проблемой 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) не решает

решено: воссоздание базы данных решило проблему

Ответы [ 22 ]

0 голосов
/ 27 февраля 2017

Вышло то же исключение, если в таблице БД был старый неснятый столбец.

Например: attribute_id NOT NULL BIGINT(20), и attributeId NOT NULL BIGINT(20),

После удаления неиспользуемого атрибута в моем случае contractId проблема была решена.

0 голосов
/ 14 декабря 2018

Возможно, это проблема со схемой таблицы. бросьте таблицу и перезапустите приложение.

0 голосов
/ 17 января 2019

Попробуйте изменить Long тип объекта на long тип примитива (если вам подходит использование примитивов).

У меня была та же проблема, и смена типа помогла мне.

0 голосов
/ 05 декабря 2018

В моем случае Я изменил эти оскорбительные таблицы и поле «id» в вопросе, я сделал его AUTO_INCREMENT, мне все еще нужно выяснить, почему во время развертывания он не делает его «AUTO_INCREMENT», так что я должен сделать это сам!

0 голосов
/ 05 декабря 2018

Что по этому поводу:

<set name="fieldName" cascade="all"> 
   <key column="id" not-null="true" />
   <one-to-many class="com.yourClass"/>
</set>

Надеюсь, это поможет вам.

0 голосов
/ 22 июля 2018

В дополнение к тому, что упомянуто выше, не забудьте при создании таблицы 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
);
0 голосов
/ 29 июля 2018

Я попробовал код, и в моем случае код ниже решил проблему. Я не установил схему должным образом

@Entity
    @Table(name="table"
         ,catalog="databasename"
      )

Пожалуйста, попробуйте добавить ,catalog="databasename" так же, как я.

,catalog="databasename"
0 голосов
/ 16 мая 2010

Добавьте метод hashCode() к вашему классу Entity Bean и повторите его

0 голосов
/ 20 июля 2017

Это случилось со мной с @ManyToMany отношениями. Я пометил одно из полей в связи с @JoinTable, я удалил его и вместо этого использовал атрибут mappedBy в @ManyToMany.

0 голосов
/ 24 июня 2017

У меня была эта проблема, по ошибке я поместил аннотацию @Transient над этим конкретным атрибутом. В моем случае эта ошибка имеет смысл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...