2011-09-20 71 views
1

這是我第一次使用hibernate,所以請原諒我,如果我要問簡單的建議。
我目前正在使用xml映射一個類(沒有註釋),我沒有我的表上的id,但有人告訴我,我被迫使用一個ID使用休眠,所以,我創建了SMS_MONITORING_ID字段到表,我也映射如下:休眠避免編號

<class name="smsbox.dal.model.SmsMonitoring" table="MST_SMS_MONITORING"> 
    <comment></comment> 

    <id name="smsMonitoringId" type="long"> 
     <column name="SMS_MONITORING_ID" /> 
     <generator class="native" > 
      <param name="sequence">ID_SMS_MONITORING</param> 
     </generator> 

    </id> 

我已經在我的oracle數據庫(ID_SMS_MONITORING)做了一個序列,而我不希望休眠處理ID可言,我甚至想避免在我的java代碼中(當我保存對象時)引用任何id。
我該如何完成我的意願,讓hibernate忽略分配id的整個過程?

PS我映射ID(長)到Oracle「數字」類型,什麼是避免可能出現的問題(長這麼想的嵌入數字或反之亦然)有誰能夠給我提供一些鏈接的規則很好地解釋Hibernate和Oracle DB的映射類型(我沒有發現任何有趣的東西)。
感謝

回答

0

您可以嘗試申報ID生成如下

<generator class="sequence"> 
     <param name="sequence">YourSquenceName</param> 
     </generator> 

當您保存對象使用Hibernate,你沒有得到/設置ID,只是離開id字段爲空, Hibernate會從你的序列中獲得一個有效的ID。

1

不幸的是,每個映射的實體都應該在每個關係數據庫要求的情況下映射ID。

只有在持久化對象時纔將ID分配給對象,因此您需要在Hibernate中使用您的序列。除此之外,您需要使用比ID更多的參數來創建equals和hashcode函數,因爲如果您有兩個對象並且它們的ID爲null,並且您的equals和hashcode函數僅使用ID,則兩個對象在Hibernate中都是相等的,並且可能是在你的代碼中有很多問題的根本原因。

+0

你實際上不需要一個ID,而是某種鍵,可能是一個複合鍵。如果你想做更新,它當然必須是獨一無二的。但是沒有理由將一個ID作爲單個列或數字。 – extraneon

+0

我不同意你的看法,根據hibernate的說法,每個表都應該有主鍵,主鍵始終是唯一的,但是你是對的,我可以創建任何類型的主鍵甚至複合類型。 –