2012-11-07 45 views
1

我有ORM設置,並且可以在現有數據庫上與Oracle一起工作,並且在訪問序列時能夠獲得插入,但由於在原始應用程序中使用了觸發器,因此跳過一個數字。Coldfusion ORM是否可以訪問Oracle觸發器

有沒有辦法讓ORM使用觸發器?

禁用觸發器不是一個選項,因爲它由現有應用程序使用,並且在遷移過程中無法禁用。

component persistent="true" table="table_name" schema="schema_name" { 
    property name="table_id" column="table_id" fieldtype="id" generator="sequence" sequence="schema_name.sequence_name"; 
... 
} 

回答

3

觸發器是不可訪問的程序單元。 「調用」觸發器的唯一方法是針對擁有的表執行適當的DML。

有兩種可能的解決方案來解決您的問題。

  1. 重寫觸發。你說的其他應用程序仍然需要觸發來填充ID,但你可以用一個有條件的改變觸發的邏輯....

    if :new.id is null then 
        :new.id := whatever_seq.nextval; --11g syntax for brevity 
    end if; 
    

    這將填充ID,當其他應用程序插入到表,但贏得了」不會覆蓋你的價值。

  2. 不用擔心。序列僅僅是唯一標識符的生成器。這些數字會上升,但如果有差距,真的沒關係。除非您正在處理行數爲的數十億個,否則在您的應用程序退休之前,您的序列極少不太可能會用盡數字。
+0

2:我考慮過這個,但我們的一些部門喜歡連續的數字。 1:這工作,但我也不得不添加 如果:new.id =''然後 並刪除了默認列值,因爲這兩者都應該照顧這一點。我不得不在服務器上使用以下語法來代替11g語法。 select schema.table.nextval into:new.id from dual; 感謝您的幫助。 – Aaron

0

您的意思是數據庫通常使用插入觸發器來分配一個ID嗎?這可以解釋爲什麼你跳過一個數字。你可以嘗試generator =「select」,這會在插入發生後讓hibernate讀回ID(並且觸發器已經被觸發)。它正是爲了處理我認爲你所描述的情況。

+0

我喜歡這個解決方案,但我得到以下錯誤 可比較條目中的空id( – Aaron

+0

之後不刷新會話)讀起來,它看起來像generator =「select」讓hibernate運行插入,然後嘗試使用對象中的其他字段來選擇該行。如果其他字段不是唯一的,那麼在CF的Hibernate實現或者你的對象中這可能是不可能的。如果您有修改觸發器的範圍,我認爲APC的解決方案是最好的。 – barnyr

+0

感謝您的研究。這聽起來像是一個合理的解釋,因爲除了一個其他值之外,測試插入內容大部分是空的字段您的解決方案本來會更容易實現,但幸運的是,我有權修改觸發器,這更加痛苦,因爲我必須讓DBA將它們移動到我的產品中。 – Aaron