在我的 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/