stophin 2019-04-10 15:46 采纳率: 37.5%
浏览 304

请问hibernate mysql如何将一个数据库提取出来的Entity作为源保存到另外一个数据库

使用mysql-connector 5和hibernate,两个数据库都配置好了,
已经验证可以做基础的select操作。
现在想在一个数据库中使用Dao获取Entity然后不用new另外的Entity,
直接使用这个Entity保存到另外数据库(因为需要的表太多,不可能给
每一个Entity都写一个拷贝方法,而且Entity其实就是JPA,
两个数据库的Entity应该是相差无几的)。也就是数据移行,有一些id
关联也需要改掉。
现在假设数据库只有一个key即id且AUTO INCREMENT,JPA注解如下
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Long id;
如果要实现上面的功能,我想使用saveOrUpdate,所以直接设置
entity.setId(null),然后希望数据库能够自动为id赋值。
然后循环所有表,把所有数据都通过这种方法“拷贝”过去。
测试时几条数据还可以,但是当正式拿到数据库中跑时,出现下面错误
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
定位在某一些id替换的Dao.saveOrUpdate中。我是先将所有数据原样“拷贝”,并记录id映射,然后重新来循环替换id,在替换时就出现了这样的错误。

我不知道是哪里有错误,是entity.setId(null)的问题吗?

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-08 20:22
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    这个问题可能是因为你在保存更新的时候没有正确地处理id的更新或者你尝试了两次更新导致的。

    首先,你需要确保在保存更新之前已经对实体进行了正确的映射。你可以检查一下你的saveOrUpdate方法是否正确地设置了@GeneratedValue(strategy=GenerationType.IDENTITY)属性,并且你是否在保存更新之后又调用过setId()方法来更新id。

    其次,如果你是在循环遍历所有的表并且尝试一次性保存更新的话,那么你应该在每次保存更新之前都检查当前id是否已经被其他地方使用过了。这可以通过查询数据库来完成,例如:

    private void saveOrUpdateAll() {
        // 所有的表名
        String[] tableNames = {"your_table_1", "your_table_2", ...};
    
        for (String tableName : tableNames) {
            List<YourEntity> entities = yourRepository.findAllByTableName(tableName);
    
            // 遍历所有符合条件的实体
            for (YourEntity entity : entities) {
                if (!isIdUnique(entity.getId())) { // 检查id是否已被其他地方使用
                    continue;
                }
    
                // 更新或插入新的实体
                entityManager.merge(entity);
            }
        }
    }
    

    在这个例子中,entityManager.merge(entity);表示合并新创建或修改的实体到数据库。

    最后,如果你在保存更新的过程中遇到了问题,可能是因为某些字段的类型不支持自动填充或者它们的大小超过了内存限制。在这种情况下,你可能需要考虑使用其他的存储引擎或者手动指定填充方式。

    总之,解决这个问题的关键在于确保你在保存更新之前对实体进行正确的映射,并且在保存更新之后检查id是否已经被其他地方使用过。同时,你也需要注意实体的字段类型以及内存限制等问题。

    评论

报告相同问题?

悬赏问题

  • ¥200 csgo2的viewmatrix值是否还有别的获取方式
  • ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
  • ¥15 请把下列每一行代码完整地读懂并注释出来
  • ¥15 pycharm运行main文件,显示没有conda环境
  • ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件
  • ¥15 为什么eclipse不能再下载了?
  • ¥15 编辑cmake lists 明明写了project项目名,但是还是报错怎么回事
  • ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集
  • ¥15 特定网页无法访问,已排除网页问题
  • ¥50 如何将脑的图像投影到颅骨上