【问题标题】:How to copy transient bean to persistent in hibernate如何在休眠中将瞬态bean复制到持久化
【发布时间】:2017-12-02 16:54:36
【问题描述】:

我正在从 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);

这给了我重复的条目“xxxxxxxxx”作为键(stockNo)

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);

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

可能是我在这里遗漏了什么。谁能提出更好的方法来实现这一目标?

【问题讨论】:

    标签: java spring hibernate


    【解决方案1】:

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

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多