2017-01-24 90 views
1

MyBatis的,插入甲骨文我與這個嘗試序列ID

<insert id="insertPersonalizacionUsuario" useGeneratedKeys="true" keyProperty="param1.id" keyColumn="id"> 
    INSERT INTO dsk_prop_personali (idpersonalizacion, idusuario, valor, centro) 
    VALUES (#{param1.idPersonalizacion}, #{param1.idUsuario}, #{param1.valor}, #{param2}) 

而與此:

<insert id="insertPersonalizacionUsuario" useGeneratedKeys="true"   keyProperty="param1.id" keyColumn="id"> 
    <selectKey keyProperty="id" resultType="int"> 
     SELECT id.nextVal from dual 
    </selectKey> 
    INSERT INTO dsk_prop_personali (id, idpersonalizacion, idusuario, valor, centro) 
    VALUES (#{id}, #{param1.idPersonalizacion}, #{param1.idUsuario}, #{param1.valor}, #{param2}) 

但不工作。由於

+0

什麼是錯誤訊息?在第二個版本中,mybatis部分很好,但你的SQL是錯誤的。它應該是'select select sequenceName.nextVal()from' –

+0

你也沒有將參數傳遞給mybatis。 –

+0

請加上oracle版本。自從Oracle 12c以來,你可能有類似Autoincremental的東西。 – Pau

回答

3

您必須BEFORE值添加order屬性<selectKey>元素。在你的情況你正在使用Oracle數據庫,直到12c版本(你的案子),它不具有自動生成的列類型,並用序列不與關係數據庫的列相關的工作。

如果你看一看的documentation reference有這解釋你的情況下,部分:

MyBatis有另一種方式來處理密鑰生成對於 不支持自動生成類型的數據庫,或也許還沒有 支持JDBC驅動程序支持自動生成的密鑰。

這裏有一個簡單(甚至很傻)的示例,將生成一個隨機ID (東西可能你不會做,但是這表明了 靈活性和如何MyBatis的真的不介意):

<insert id="insertAuthor"> 
    <selectKey keyProperty="id" resultType="int" order="BEFORE"> 
     select CAST(RANDOM()*1000000 as INTEGER) a from SYSIBM.SYSDUMMY1 
    </selectKey> 

    insert into Author 
    (id, username, password, email,bio, favourite_section) 
    values 
    (#{id}, #{username}, #{password}, #{email}, #{bio}, #{favouriteSection,jdbcType=VARCHAR}) 

在上面的例子中,selectKey元素將會首先運行時, Author的id會被設置,然後插入語句會 被調用。這會給您一個類似於數據庫中自動生成的密鑰 的行爲,而不會使Java代碼複雜化。

所以,可以肯定的是selectKey語句將首先運行,你需要使用帶有BEFORE值訂單屬性,該屬性這個例子中,引用文檔中後解釋非常好爲了這可之前或之後設置。如果設置爲BEFORE,那麼它就會 首先選擇鍵,設置keyProperty,然後執行 插入語句。如果設置爲AFTER,那麼先執行插入語句,並 然後selectKey元素 - 這是一個像 Oracle數據庫可能已經嵌入序列通用插件 語句內調用。

因此,您必須keyProperty值與插入PARAM爲你做了匹配(keyProperty="id"將是帕拉姆在插入語句:#{id}),並指定resultType爲INT所以它是一個數字序列。

否則,您必須使用序列ID名稱,你的情況是確保您的序列被稱爲ID(因爲你使用id.NEXTVAL)做你的選擇:

SELECT YOUR_SEQ.NEXTVAL FROM DUAL 
+0

謝謝,但我無法使它工作 \t \t SELECT id.nextVal()從雙 \t \t INSERT INTO dsk_prop_personali(ID,idpersonalizacion,idusuario,勇氣的Centro) VALUES(#{ID} ,#{param1.idPersonalizacion},#{param1.idUsuario},#{param1.valor},#{param2}) ORA-02287:序列號不允許在這裏 –