java - 对父表和外键表进行批量操作使用MySQL还是Java更好

标签 java mysql spring-boot jpa

在我的 Spring Boot 应用程序中,每小时我都会从响应中获取新的父级和子级数据,我需要使用这些数据来更新数据库。响应可以包含新的父级、新的子级、具有更新的现有父级,如果响应中不存在父级和/或子级,则需要将它们从数据库中删除。

这一切都需要在单个事务中发生,以避免竞争条件。

我有一个如下所示的父表:

Parent table
id | name | age | email | child_id
----------------------------------

还有一个带有父级外键的子表:

Child table
id | parent_id | name
---------------------

还有一个映射表

id | parent_id | child_id
-------------------------

1.) 第一种方法是插入重复的“名称”更新所有新的父数据,然后插入新的子数据,然后删除响应中未包含的所有子数据,最后删除所有父数据未包含在响应中

类似于:

//For each new parent run native query

INSERT INTO PARENT (name) VALUES (name, age, email)
  ON DUPLICATE KEY 
    UPDATE name=name, age=age, email=email;

//For each new child insert with native query

INSERT INTO CHILD (name) VALUES (name)
  ON DUPLICATE KEY
    UPDATE name=name

//Remove old Child data

DELETE FROM CHILD WHERE name not in (new_child_name_list);

//Remove old Parent Data

DELETE FROM Parent WHERE name not in (new_parent_name_list);

为了加快速度和批量处理,我将在 EntityManager 中维护自己的事务并运行上述序列。我担心性能以及其中一些操作是否可以组合。我也不知道如何仅使用 native 查询来设置映射

2.) 我从数据库获取所有数据并自己在 Java 中完成所有逻辑。


public void refresh(List<Parent> newParents, List<Child> newChildren) {

    //EntityManager transaction logic here
    List<ParentEntity> oldParents = parentRepo.findAll();
    List<ChildEntity> oldChildren = childRepo.findAll();

    for(ParentEntity oldParent : oldParents) {
        if (/* old matches a new parent */) {
            //update matching old parent to new parent
            //add associated children to parent before save
        } else {
            // no match, delete old parent
        }
    }

}

使用 native 查询进行多个 sql 操作更好,还是用 java 处理大部分工作更好?

编辑:多对多关系清晰度

最佳答案

相信您可以轻松地使用Hibernate或其他ORM工具进行级联操作。我认为在数据库端同步也不是一个好主意。

请引用here

Query q = session.createQuery("from Stock where stockCode = :stockCode ");
q.setParameter("stockCode", "4715");
Stock stock = (Stock)q.list().get(0);
session.delete(stock);

关于java - 对父表和外键表进行批量操作使用MySQL还是Java更好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56297452/

相关文章:

java - 在 Eclipse 中为整个包生成 equals()

java - .jar 导出不理解项目文件夹内的相对路径

java - Hibernate Criteria API - 添加标准 : string should be in collection

mysql - 我需要转义子查询吗?

java - 如何使用 Spring Boot RSocket 服务器支持 WebSocket 传输?

java - Spring @Async 与可完成的 future 运行异步

java - 列表抛出 UnsupportedOperationException

java - 一旦读取大约 30,000 个邮政编码,程序就会出现滞后

php - 如何将ASCII字符串转换为Bangla UTF-8字符串?

java - 使用 SpringBoot-App 作为 Ubuntu 18.04 服务运行 Tomcat 9