将子实体添加到现有的父级休眠onetomany

时间:2020-10-05 16:26:42

标签: java spring spring-boot hibernate jpa

我是新来的冬眠 我想将孩子添加到现有的父实体中

@Entity
@Table(name="kanban_col")
public class kanban_columns {
    @Id
    @GeneratedValue(generator="system-uuid")
    @GenericGenerator(name="system-uuid", strategy = "uuid")
    private String id;

    @Column(name="col_name")
    private String colName;

    @Column(name="kbid")
    private String boardId;

    @OneToMany(mappedBy = "kanban_col_id",cascade = CascadeType.PERSIST,orphanRemoval = true,fetch=FetchType.LAZY)
    private List<Tasks> tasks;

    Getter and setters....
}
@Entity
@Table(name="kanban_tasks")
public class Tasks {
    @Id
    @GeneratedValue(generator="system-uuid")
    @GenericGenerator(name="system-uuid", strategy = "uuid")
    private String id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JsonBackReference
    @JoinColumn(name = "cid", updatable = true, insertable = true,referencedColumnName = "id")
    private kanban_columns kanban_col_id;

    @Column(name="work_id")
    private String workId;

Getter and setters....
}

服务

    @Transactional
    public kanban_columns createTask(final kanban_columns source) {
        final kanban_columns destination = new kanban_columns();

        copyTask(source, destination);

        repository.save(destination);

        return destination;
    }

    @Transactional
    public void save(final kanban_columns attachment)
    {
        repository.save(attachment);
    }
 public void copyTask(final kanban_columns source, final kanban_columns destination){
        destination.setTasks(source.getTasks());
    }
{
    "kanban_col_id":"ff80808174f95b8c0174f95ba1e30000",
        "tasks":[{
        "workId":"4028ab37735ae04e01735b4833ba0000"
    },
{
        "workId":"4028ab37735ae04e01735b4833ba0001"
    },
]
    
}

我正在尝试做,但是在kanban_col中创建了新行,但是我需要插入到现有行中 请告诉我如何在@onetomany中的现有父级的子级实体中添加新行,以及如何更新,删除现有父级的子级行 谢谢.. !!

1 个答案:

答案 0 :(得分:0)

您可以在kanban_columns方法中创建createTask的新实例,因此新行将添加到数据库中。您应该找到具有相关任务的现有kanban_columns,然后将新任务添加到列表中。

您需要在存储库中使用一个新方法,该方法将加载并返回具有已关联任务的kanban_columns实例:

@Query("select kc from kanban_columns kc left join fetch kc.tasks where kc.id = :id")
kanban_columns findByIdWithTasks(@Param("id") String id);

kanban_columns中定义一个辅助方法:

public void addTasks(Collection<Task> tasks) {
    tasks.forEach(t -> t.setKanban_column_id(this));
    this.tasks.addAll(tasks);
}

您的createTaskcopyTask方法应更改为:

@Transactional
public kanban_columns createTask(final kanban_columns source) {
    final kanban_columns destination = repository.findByIdWithTasks(souce.getId());

    copyTask(source, destination);

    repository.save(destination);

    return destination;
}

public void copyTask(final kanban_columns source, final kanban_columns destination) {
    destination.addTasks(source.getTasks());
}

要删除任务,您需要将级联从PERSIST更改为ALL,并在kanban_columns中定义类似的方法:

public void deleteTask(Task task) {
    this.tasks.remove(task);
}