2016-05-10 6 views
0

私は、ハイバーネイトに並行処理をさせようとしています。そして、いくつかの研究の後に@Versionの使い方が出てきました。私のアプリケーションは、MY_TABLEに新しい行を挿入しようとすると@Versionは@DynamicInsertで動作しません

CREATE TABLE MY_TABLE (
    ID NUMBER NOT NULL 
    , VERSION NUMBER NOT NULL 
); 

ALTER TABLE MY_TABLE ADD CONSTRAINT PK_MY_TABLE KEY (ID); 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.SequenceGenerator; 
import javax.persistence.Table; 
import javax.persistence.Version; 

import org.hibernate.annotations.DynamicInsert; 
import org.hibernate.annotations.DynamicUpdate; 
import org.hibernate.annotations.Generated; 
import org.hibernate.annotations.GenerationTime; 

@Entity 
@Table(name = "MY_TABLE") 
@SequenceGenerator(name = "SQ_NAME", sequenceName = "SQ_MY_TABLE", initialValue = 1, allocationSize = 1) 
@DynamicUpdate 
@DynamicInsert 
public class MyTable implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @Column(name = "ID") 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SQ_NAME") 
    private Long id; 

    @Column(name = "VERSION", insertable = false, updatable = false) 
    @Version 
    @Generated(GenerationTime.ALWAYS) 
    private Long version; 

    ... getters and setters 
} 

を、Oracleは

ORA-01400: cannot insert NULL into ("MY_TABLE"."VERSION") 

は、私が何をしないのです例外をスロー:以下 は、私がこれまでやっているものの例を次の? @DynamicInsertを削除した場合にのみ動作します...

PS:私はそれを使用しないと、最初に再クエリーせずに2つの更新を同じレコードで実行できないため、私は@ Generated(GenerationTime.ALWAYS)を使用しています。

環境:JBoss EAP 6.3、java 1.7.0_79、hibernate 4.3.11.Final(JTAを使用)、JSF 2.0、およびOracle 12c。

答えて

0

さらに調査したところ、GenerationTime.ALWAYSまたはGenerationTime.INSERTを使用すると、@Versionで注釈が付けられたフィールドを埋めるデータベーストリガーを提供する必要があることが分かりました。オラクルで

は、例えば、トリガは、このようなものです:

CREATE OR REPLACE TRIGGER TRG_MY_TABLE_BIUR 
BEFORE INSERT OR UPDATE 
    ON MY_TABLE 
    FOR EACH ROW 
DECLARE 
BEGIN 
    IF INSERTING THEN 
     :NEW.VERSION := 0; 
    ELSE 
     :NEW.VERSION := :OLD.VERSION + 1; 
    END IF; 
END TRG_MY_TABLE_BIUR; 
/
関連する問題