7

PlayでHibernate4.1.3(JPA)を使用しています!フレームワーク。データベースはPostgreSQL8.4.2です。スキーマはを使用して生成されhibernate.hbm2ddl.auto="update"ました。

@Id短いバージョン:。であるフィールドを持つクラスがあり@GeneratedValueます。時々、persistそれを実行すると、null列違反が発生します。なぜですか?


詳細:

データベースに保存したい非常に単純なクラスがあります。これは次のようになります。

@Entity
class MyObject {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public Long id;

    @NotNull
    public String email;

    public Integer total;
}

私は通常、MyObjectのインスタンスを作成し、 nullのときemailtotalフィールドに値を割り当て、idを介して保存しEntityManager.persist()ます。Hibernateは新しいオブジェクトのIDを取得し、それをDBに保存します。

ただし、次のスタックトレースが表示されることがあります。

2012-05-19 00:45:16,335 - [ERROR] - from org.hibernate.engine.jdbc.spi.SqlExceptionHelper [SqlExceptionHelper.java:144] in play-akka.actor.actions-dispatcher-6 
ERROR: null value in column "id" violates not-null constraint

2012-05-19 00:45:16,350 - [ERROR] - from application in play-akka.actor.actions-dispatcher-6 


! @6ad7j3p8p - Internal server error, for request [POST /method] ->

play.core.ActionInvoker$$anonfun$receive$1$$anon$1: Execution exception [[PersistenceException: org.hibernate.exception.ConstraintViolationException: ERROR: null value in column "id" violates not-null constraint]]

これはどのように可能ですか?どうすれば問題を突き止めることができますか?

Hibernateによって生成された関連するDDLは次のとおりです。

CREATE TABLE myobject (
    id bigint NOT NULL,
    email character varying(255) NOT NULL,
    physical integer
);

CREATE SEQUENCE hibernate_sequence
    START WITH 1
    INCREMENT BY 1
    NO MAXVALUE
    NO MINVALUE
    CACHE 1;


ALTER TABLE ONLY dailydetailedscore
    ADD CONSTRAINT dailydetailedscore_pkey PRIMARY KEY (id);
4

4 に答える 4

3

注釈を試してください@org.hibernate.annotations.GenericGenerator(name = “test-hilo-strategy”, strategy = “hilo”)

@Id
@org.hibernate.annotations.GenericGenerator(name=“hilo-strategy”, strategy = “hilo”)
@GeneratedValue(generator = ”hilo-strategy”)

誰かが上で述べたように、AUTOあなたが思うことをしません。基盤となるDBを使用して、値の生成方法を決定します。シーケンス(oracleの場合)、ID列(mssqlの場合)、またはdb固有の何かを選択する場合があります。

ここでのアプローチは、Hibernateが提供する「hilo」と呼ばれる内部戦略を使用します。

提供されている各ジェネレーターの機能の詳細については、「ジェネレーター」を扱っているHibernateリファレンスマニュアルの第5章を参照してください。

于 2012-05-19T05:38:05.590 に答える