2011-09-08 70 views
0

假設在數據庫表中有一個非關鍵列,稱爲RECORD_ID,它在數據庫中自動生成/排序。@產生於HSQL DB

現在在上面表格的實體中,RECORD_ID字段的上方,我使用hibernate annotation @Generated來指示休眠,DB將負責將值插入到特定字段中。它看起來像下面這樣:

@Column(name = "RECORD_ID", unique = true, nullable = true, insertable = false, updatable = false) 
    @Generated(GenerationTime.INSERT) 
    private Long recordId; 

我運行我的代碼,它工作正常。 DB按預期插入值。

現在,我用HSQL編寫一個單元測試用例來確保我的邏輯完好無損。 該邏輯具有一個基於RECORD_ID獲取記錄的查詢。

現在,當我創建夾具並調用我的測試時,HSQL在保存夾具時不會爲記錄的RECORD_ID生成值。它將其保留爲空。但是我打算測試的邏輯是基於RECORD_ID獲取的,這在這裏是不可能的。

它只是在HSQL DB中保持爲空。因此我無法完成單元測試!

請注意解決此問題或解決方法。

請在下面找到

@Test 
public void testProductCancelDAL() { 
    savePrerequisites(); 
    Logic myLogic = new Logic(); 
    /* Logic fetches the reservation record based on RECORD_ID */ 
    assertNotNull(myLogic.invoke()); 

} 
public void savePrerequisites() { 
    //Stroing product type 
    Product product = ProductFixture.createProduct(); 
    sessionFactory.getCurrentSession().save(product); 

    //Storing Itinerary 
    Itinerary itn = ItnFixture.create(); 
    sessionFactory.getCurrentSession().save(itn); 

    Reservation res = ReservationFixture.create(); 
    sessionFactory.getCurrentSession().save(res); 
    sessionFactory.getCurrentSession().flush(); 
} 
+0

你是說生產代碼按預期工作,但單元測試中類似的代碼沒有,是嗎?如果是這樣,那麼向我們展示單元測試代碼。 –

+0

HSQLDB中列的定義是什麼?你可以發佈一個CREATE TABLE語句嗎? –

+0

@JB Nizet是對的JB..Will也會發布單元測試代碼 – Sripaul

回答

2

根據您在評論中所說的話,您似乎正在測試一些代碼,這些代碼依賴於生成RECORD_ID的數據庫中的觸發器,但是您在內存數據庫中測試此觸發器時,不存在。顯然,這是行不通的。您需要創建與生產數據庫中相同的觸發器。請參閱http://hsqldb.org/doc/2.0/guide/triggers-chapt.html在HSQLDB數據庫中創建觸發器。

1

在你的情況下,單元測試代碼,是不是RECORD_ID主鍵?

在這種情況下,您應該使用具有@Id註釋的@GeneratedValue。

數據庫生成值的問題是插入後必須重新讀取記錄(它不適用於AUTOINCREMENT列,其中最後生成的ID可以通過專用指令讀取)。

+0

但這裏的RECORD_ID不是主鍵 – Sripaul