2017-12-02 160 views
0

我正在從excel文件執行批量上傳。我想爲新產品創建插入並更新現有的產品,stockId是存在於文件中的唯一密鑰,主鍵是stoneId並且不存在於文件中。插入按預期工作,但我在更新時遇到困難。據我所知,我們不能直接合並hibernate中的瞬態對象,我想知道實現這一點的最佳方法。如何將瞬態bean複製到休眠狀態

我曾嘗試以下選項至今: 1)使用Apache公地的BeanUtils:

Stone s = getStoneByStockNo(t.getStockNo()); 
    Integer id = s.getStoneId(); 
    try { 
     BeanUtils.copyProperties(s, t); 
    } catch (IllegalAccessException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (InvocationTargetException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    s.setStoneId(id); 
    entityManager.merge(s); 

這讓我複製了鑰匙進入 'XXXXXXXXX'(stockNo)

2)我已經試過春天BeanUtils的:

Stone s = getStoneByStockNo(t.getStockNo()); 
    String [] ignore = {"stoneId"}; 
    BeanUtils.copyProperties(s, t, ignore); 
    entityManager.merge(s); 

這DONOT給我任何錯誤,但由於某些原因的BeanUtils沒有複製性,我沒有得到任何更新VA梅毒。

3)我想手動設置使用的setter值:

Stone s = getStoneByStockNo(t.getStockNo()); 
    s.setSize(t.getSize()); 
    s.setPurity(t.getPurity()); 
    s.setLab(t.getLab()); 
    entityManager.merge(s); 

這是工作的預期,但我DONOT喜歡這種方式,因爲我有大量的屬性,將有充分的時間來修改代碼當他們的屬性發生任何變化時

可能是我錯過了這裏的東西。任何人都可以提出一個更好的方法來實現這一目標?

回答

0

在第二種方法中,您嘗試合併源目標實體。正如你可以在doc中看到的,它與apache commons BeanUtils相反。

試試這個方法,它將所有值從牛逼複製到小號,並會忽略你在陣列傳遞的值。

Stone s = getStoneByStockNo(t.getStockNo()); 
String [] ignore = {"stoneId"}; 
BeanUtils.copyProperties(t, s, ignore); 
entityManager.merge(s); 
+0

好吧,那是我的不好!謝謝你糾正我。 – Harsh

+0

對於任何面臨類似問題的人來說,這個問題對我非常有幫助:https://stackoverflow.com/questions/29297468/copy-properties-from-one-bean-to-another-not-the-same-class-recursively -inclu – Harsh