在我的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中维护自己的事务并运行上述序列。我担心性能以及其中某些操作是否可以合并。我也不知道如何仅使用本机查询来设置映射
2.)我从db获取所有数据,并亲自执行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
}
}
}
在本地查询中执行多个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);