1. ホーム
  2. java

[解決済み] Hibernateです。"フィールド 'id' はデフォルト値を持っていません"

2022-02-14 12:56:28

質問

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 ).

どなたか教えてください。

EDIT 2: 確認済み @GeneratedValue(strategy = GenerationType.XXX) は解決しません。

SOLVED: データベースを再作成すると、問題が解決しました。

解決するには?

を実行しても、モデルやORMに加えられた変更がデータベースに正確に反映されないことがあります。 SchemaUpdate .

もし、このエラーに納得のいく説明がないようであれば、データベースを再作成し(あるいは、少なくとも新規に作成し)、そのデータベースの足場を SchemaExport .