2014-02-17 20 views
0

我是Hibernate的新手,問題是「生成器類是否需要Hibernate中的ID標記?」生成器類是否需要Hibernate中的ID標記?

在我的表中有觸發器提及下面和我的表是現有的表和記錄。只是我做了代碼從原生SQL更改爲Hibernate會話。在這種情況下「生成器類是否需要在Hibernate中使用ID標記?」。這裏我的例外是記錄需要插入下一個序列值。

TRIGGER TRG_BI_APPLICATION_DATA_LOCK 
    BEFORE INSERT 
    ON APPLICATION_DATA_LOCK REFERENCING NEW AS NEW OLD AS OLD 
    FOR EACH ROW 
DECLARE 
    exception_no_null_pk EXCEPTION; 
BEGIN 
    IF :new.APP_DATA_LOCK_ID is null 
    THEN 
    SELECT SEQ_APPLICATION_DATA_LOCK_PK.nextval 
     INTO :new.APP_DATA_LOCK_ID 
     FROM dual; 
    END IF; 
END; 

假設在插入調用觸發器之前會創建下一個ID值並插入將會發生。所以,在HBM文件中,我們需要生成器類,或者如果我們需要哪種生成器必須使用的手段? 請幫我在這方面...

謝謝...

回答

0

我要推斷你是從你的問題的標題問什麼,答案是否定的,你不需要@GeneratedValue註釋只有當你想要指定a)你的ID將會是一個不是由Hibernate生成的值,並且b)如果你想指定如何生成你的ID,你的ID才能工作。

我認爲你需要做的是這樣的:

@Entity 
@Table 
public class Foo{ 
    @Id 
    @GeneratedValue(generator = "applicationLockSequence") 
    @SequenceGenerator(name = "applicationLockSequence" sequenceName = "SEQ_APPLICATION_DATA_LOCK_PK") 
    private int id; 
.... 
} 

這基本上指定存在與該名稱的數據庫上的序列,而休眠應使用順序來分配你的對象的ID時它會被保存。不需要在觸發器的數據庫級別執行此操作,但這也是一種有效的方法。如果你想用觸發器做到這一點,只需要忽略@GeneratedValue@SequenceGenerator

希望能回答你的問題。

TL; DR OP對hibernate映射使用.hbm文件。 由於這裏給出:How To Use Sequence In Hibernate As A Property In XML Mapping

<id name="id" column="item_id> 
    <generator class="sequence"> 
     <param name="sequence">SEQ_APPLICATION_DATA_LOCK_PK</param> 
    </generator> 
</id> 

應該是所有你需要做的這一點。

+0

根據你的答案,我不需要在hbm文件中使用任何生成的類。寫?但是,沒有提到以下異常:org.hibernate.id.IdentifierGenerationException:在調用save()之前,必須手動分配此類的ids:ApplicationDataLock – Subbu

+0

Ahh,您正在使用hbm文件指定映射嗎?我認爲您不需要包含生成的,因爲您的ID的生成是通過觸發器在數據庫級別發生的。它的有效含義是,如果遇到需要獲取對象ID的情況,則需要將其保存到數據庫,然後查詢數據庫以使對象填充ID。所有休眠需要知道的是,你的對象有一個字段是它的ID,如果你不告訴它,它不關心它是如何生成的。試試吧,讓我知道 – JamesENL

+0

如果你確實想使用你的序列而不使用觸發器,那麼使用你的hbm文件中的鏈接中給出的以下配置。 http://stackoverflow.com/questions/5082175/how-to-use-sequence-in-hibernate-as-a-property-in-xml-mapping – JamesENL

相關問題