2011-08-04 65 views
1

我需要確保我創建的新供應商部分不存在。這是目前像這樣做有沒有一種比較便宜的方法來在休眠狀態下進行以下主鍵驗證

try { 
    entityManager.get(SupplierPartEntity.class, 
    new SupplierPartPK(supplierID, partID)); 

    throw new CreateSupplierPartActionException("Supplier part record exists for " + supplierID 
    + "/" + partID + "."); 
} catch (final RecordNotFoundException e) { 
    /* supplier part not found - do nothing */ 
} 

其值得一提的EntityManager將拋出一個創紀錄的未發現異常時的get()通常會返回null;

回答

1

如果用「較便宜」的意思是「沒有命中數據庫」,那麼否,除非您在內存中保存所有現有主鍵的緩存。除此之外,數據庫是唯一知道它們的東西。

+0

我知道數據庫命中是必需的,試圖避免一個空的catch塊,因爲它的邏輯將遵循的預期路徑。 – Luke

+0

這是一個性能或代碼風格的問題?如果性能不好,不要擔心,除非分析人員告訴你存在問題。如果代碼風格,在你的'entityManager'中添加一個封裝了「這個事情是否存在」邏輯的方法。 –

+0

謝謝,我讀過空的catch塊是一個不好的做法,並試圖找到一個更優雅的方法。我將研究封裝「存在」它仍然使用entiyManager.find(Class.class,PK)並檢查null,但返回一個布爾值。 – Luke

0

它看起來像你使用供應商ID和零件ID作爲主鍵來強制唯一性?

爲什麼不繼續嘗試創建新記錄並在發生/發生時捕獲唯一性約束違規? (對不起,該項目已存在)

+0

(可能錯誤地)處理一個不唯一的約束的開銷會更大,因爲它將拋出數據庫中的SQL異常,並將其包裝在ORM(生成的堆棧跟蹤)中拋出的休眠異常中。 – Luke

相關問題