繁体   English   中英

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

[英]How to copy transient bean to persistent in hibernate

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

到目前为止,我已经尝试了以下选项: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);

这不会给我带来任何错误,但是由于某种原因,BeanUtils不会复制属性,因此无法获取任何更新的值。

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

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

这可以按预期工作,但是我不喜欢这种方式,因为我拥有大量的属性,并且每次对属性进行任何更改时都必须修改代码

可能是我在这里错过了一些东西。 有人可以建议一种更好的方法来实现这一目标吗?

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM