2017-12-02 159 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