2011-02-04 56 views
2

我正在使用Hibernate,並且我有一個流程/最佳實踐問題。舉一個例子,假設我們有兩個實體卡車和車輪。該車輪有2個屬性wheelid和wheelmanufacturer。因此,在我的應用程序中,用戶可以創建卡車,他們可以選擇數據庫中存在的各種車輪或創建他們自己的車輪。使用休眠服務的最佳實踐

我的問題是,當我收到來自前端卡車對象,如何讓我相信,如果車輪不存在於數據庫中,該數據庫副本使用,如果它不存在於數據庫中,它被添加。這裏是我的服務現在

public Truck saveTruck(Truck truck) 
{ 
    //Yes, this is a two-wheel truck =) 
    Wheel frontWheel = truck.getFrontWheel(); 
    if(frontWheel != null && frontWheel.getWheelId() != null) 
    { 
     Wheel dbWheel = wheelDao.getWheelById(frontWheel.getWheelId()); 
     if(dbWheel != null) 
     { 
       truck.setFrontWheel(dbWheel); 
     } 
    } 
} 

這樣做的動機是,我不希望用戶能夠覆蓋數據庫中的對象是如何工作的一個基本的例子,但他們需要的是能寫自定義的。上面的代碼有效,但如果你有一輛擁有10個屬性的卡車,它就變得非常多餘。我想知道別人怎麼解決這個問題。

感謝

回答

1

這也正是merge()操作做什麼。

也就是說,你的代碼可以通過以下替換:

public Truck saveTruck(Truck truck) { 
    //Yes, this is a two-wheel truck =) 
    Wheel frontWheel = truck.getFrontWheel(); 
    if(frontWheel != null) { 
     truck.setFrontWheel(wheelDao.merge(dbWheel));   
    } 
} 

其中wheelDao.merge()提供Session.merge()訪問。

如果你的Truck有許多特性將被合併,可以配置它們級聯一個merge()操作和合並Truck作爲一個整體:

public Truck saveTruck(Truck truck) { 
    return session.merge(truck); 
} 

參見:

+0

我認爲合併將涉及解決方案。在通過stackoverflow提供的幫助之後,我想我只需要開拓進取。整個「保存」,「更新」,「合併」範式之間存在很多細微差別,我覺得我可以學習的唯一方式就是受到傷害,並且差異打擊了你。 – 2011-02-04 18:20:37

1

我解決這幾樣在應用程序的用戶界面的一部分問題。我有一個組件可以顯示輪子等值對象,如果用戶無法從現有輪子找到請求的輪子,用戶可以通過該組件創建一個新輪子。

+0

非常聰明。我會記住這一點,並且絕對會在我的應用中使用它。然而,我有一個討厭的感覺,這個問題或者一個模擬將會使它的醜陋頭部變得難以置信。現在我想把野獸放下。 – 2011-02-04 14:37:06

0

我會通過從分隔條件後端的GUI實現這一點。

該GUI將使用TruckDTO這幾乎是卡車對象,但不是是Weel它包含一個WeelManufactuer字符串。

GUI控制器recive的TruckDTO並將其轉發給一些服務。 服務,與DB中的製造商一起搜索Weel。如果沒有這樣的話,它會創造它。然後它使用weel(新的或現有的)和TruckDTO創建卡車對象。

同樣是用於更新卡車。 (當然,不要創造一輛新卡車,你必須改變它)。

我把這個邏輯來處理,不是在接口部分,但在應用的服務的一部分。因爲沒有GUI實現可以忘記執行正確的處理。

+0

看看卡車和Weel之間的刪除孤兒「關係船」,我可以幫助你刪除未使用的卡片。 - 但我不確定。 – Ralph 2011-02-04 14:47:04