如何在休眠状态下将临时bean复制到持久性

时间:2017-12-02 16:54:37

标签: java spring hibernate

我正在从excel文件执行批量上传。我想为新产品创建插入并更新现有产品,stockId是文件中存在的唯一键,主键是stoneId,不存在于文件中。插入正在按预期工作,但我遇到更新困难。据我所知,我们无法在hibernate中直接合并瞬态对象,我想知道实现这一目标的最佳方法。

到目前为止,我尝试了以下选项: 1)使用apache commons 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);

这给了我关键字(stockNo)

的重复条目'xxxxxxxxx'

2)我尝试过Spring BeanUtils:

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

这个donot给了我任何错误,但由于某种原因,BeanUtils没有复制属性,我没有得到任何更新的值。

3)我尝试使用setter手动设置值:

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

这是按预期工作的,但我不喜欢这种方式,因为我有大量的属性,并且每当它们的属性发生任何变化时都必须修改代码

可能是我在这里遗漏了一些东西。任何人都可以建议一个更好的方法来实现这个目标吗?

1 个答案:

答案 0 :(得分:0)

在您的第二种方法中,您尝试合并目标的源实体。正如您在doc中所看到的,它与apache commons BeanUtils相反。

尝试这种方式,它会将所有值从 t 复制到 s ,并忽略您在数组中传递的值。

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