【发布时间】:2021-01-13 16:47:15
【问题描述】:
我有一个场景,我需要创建一个引用前任列表和后继列表的实体。当收到请求时,我需要创建如下实体:
请求:
{
// create request details for task2
"predecessors": ["task1"],
"successors": ["task3"]
}
我的新实体“task2”现在应该在 DB 中创建如下。
task1 <- task2 -> task3
task1 -> task2
task2 <- task3
在将 task2 保存为 task1 和 next 作为 task3 的同时,我还想将 task1 的下一个更新为 task2,将 task3 的上一个更新为 task1。
我正在努力为上述场景提出 JPA 实体关系。
@Entity
@Table(name = "task")
public class Entity {
@ManyToMany
private Set<TaskDatabaseEntity> successors;
@ManyToMany
private Set<TaskDatabaseEntity> predecessors;
}
更新:下面是我尝试保存实体的代码。
TaskDatabaseEntity newTaskEntity = taskEntityFromCreateEvent();
List<TaskDatabaseEntity> taskEntities = List.ofAll(new ArrayList<>());
if(domainEvent.getPredecessors() != null && !domainEvent.getPredecessors().isEmpty()) {
for(TaskEvent event : domainEvent.getPredecessors()) {
TaskDatabaseEntity entity = taskEntityFromUpdateEvent((TaskUpdate) event, userEntity);
java.util.Set<TaskDatabaseEntity> suc = entity.getSuccessors() == null?
new HashSet<>() : entity.getSuccessors();
suc.add(newTaskEntity);
taskEntities.append(entity);
newTaskEntity.getPredecessors().add(entity);
}
}
if(domainEvent.getSuccessors() != null && !domainEvent.getSuccessors().isEmpty()) {
for(TaskEvent event : domainEvent.getSuccessors()) {
taskEntityFromUpdateEvent((TaskUpdate) event, userEntity);
TaskDatabaseEntity entity = taskEntityFromUpdateEvent((TaskUpdate) event, userEntity);
java.util.Set<TaskDatabaseEntity> pre = entity.getPredecessors() == null?
new HashSet<>() : entity.getPredecessors();
pre.add(newTaskEntity);
taskEntities.append(entity);
newTaskEntity.getSuccessors().add(entity);
}
}
taskEntities.append(newTaskEntity);
List<TaskDatabaseEntity> savedEntities = List.ofAll(taskEntityRepository.saveAll(taskEntities));
newTaskEntity =
savedEntities.filter(task -> task.getObjectId().equals(domainEvent.getEventId())).toList().get(0);
我正在使用saveAll 一起更新所有实体,但返回的已保存列表为空。我不理解为什么。关于我哪里出错的任何建议?我怀疑我的实体关系,可能是我定义的关系错误。
更新 1:
我试图通过mappedBy 来维持彼此的关系,这样关系就会被隐含,我不需要更新所有实体。
@ToString.Exclude
@EqualsAndHashCode.Exclude
@ManyToMany(mappedBy="predecessors", fetch = FetchType.LAZY)
private Set<TaskDatabaseEntity> successors;
@ToString.Exclude
@EqualsAndHashCode.Exclude
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(schema = "eai", name = "task_ancestors")
private Set<TaskDatabaseEntity> predecessors;
这是我现在保存它的方式
TaskDatabaseEntity newTaskEntity = taskEntityFromCreateEvent();
if(domainEvent.getPredecessors() != null && !domainEvent.getPredecessors().isEmpty()) {
for(TaskEvent event : domainEvent.getPredecessors()) {
TaskDatabaseEntity entity = taskEntityFromUpdateEvent((TaskUpdate) event, userEntity);
newTaskEntity.getPredecessors().add(entity);
}
}
newTaskEntity = taskEntityRepository.save(newTaskEntity);
我现在可以保存新实体及其前身,并且可以从下表中隐含后继者
【问题讨论】:
-
你能展示一下你如何保存的代码吗?
-
更新了保存实体组的代码。每个前任都以他们的继任者作为当前更新,每个继任者都以其前任作为当前更新。
标签: java sql hibernate jpa spring-data-jpa