web-dev-qa-db-ja.com

@GeneratedValue(strategy = GenerationType.AUTO)が思ったように機能しない

オブジェクトをデータベースに永続化しようとしています。 「列IDはnull値エラーを受け入れることができません」を取得し続ける。私のオブジェクトは次のようになります:

    @Entity
public class TestTable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id = 0;

    @Column(nullable=false, length=256)
    private String data = "";

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

}

私の永続化機能:

public static synchronized boolean persistObject(Object obj){
        boolean success = true;
        EntityManager em = null;
        EntityTransaction tx = null;
        try{
            em = getEmf().createEntityManager();
            tx = em.getTransaction();
            tx.begin();
            em.persist(obj);
            tx.commit();

        } catch (Exception e){
            success = false;
        } finally{
            try{
                em.close();
            } catch(Exception e){
                //nothing
            }
        }
        return success;
    }
20
NullPointer0x00

GenerationType.TABLEを使用できます。そうすることで、jpaはIDの割り当てにシーケンステーブルを使用し、移植性を低下させるシーケンス値や自動インクリメント値やトリガーを生成する必要がなくなる可能性があります。

また、Java= int型はデフォルトで0で開始されるため、これも取り除くことができることに注意してください。

22
Cem Güler

私の場合、それは悪い方言についてでした:

hibernate.dialect=org.hibernate.dialect.H2Dialect

の代わりに:

hibernate.dialect=org.hibernate.dialect.PostgreSQL9Dialect

本番データベースに切り替えたとき。 Hibernateは、異なるdbエンジン用に準備された戦略を使用しようとしました。

4
cyprian

私はあなたに似た症状の問題を抱えていました。結局、データベース接続の構成が間違っていることがわかりました。スキーマが正しくない古いデータベースに接続していました。新しいスキーマは主キー列を次のように宣言しました

"ID" BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1)

したがって、 データベース自体が主キーを自動的に生成した に対して、古いスキーマはそれを次のように宣言しました

"ID" INTEGER NOT NULL

Hibernateは新しいスキーマに対して正しいコードを実行しましたが、古いスキーマはSQL INSERTID列の値を提供するよう要求したため、古いスキーマで失敗しました。

2
Raedwald

ID列がIntの場合、Hibernateはサイレントで不可解な方法で失敗します。コードではLongに、データベースでは符号なし64ビット整数に変更してみてください。これで問題が解決しました。

1
Alex R

または、@GeneratedValue(strategy = GenerationType.AUTO)ではなく@GeneratedValue(strategy = GenerationType.SEQUENCE)で試してください。

0
Abdennour Toumi