【问题标题】:SpringBoot - Entity propagation for relationshipsSpring Boot - 关系的实体传播
【发布时间】:2021-06-05 00:47:51
【问题描述】:

我有两个实体:WorkoutTemplate 和 ConcreteExercise。

在 WorkoutTemplate 中我与 ConcreteExercises 有这种关系

@OneToMany(cascade = CascadeType.ALL, mappedBy = "belongingWorkout", fetch = FetchType.LAZY)
private List<ConcreteExercise> concreteExercises;

在 ConcreteExercise 中,我与 WorkoutTemplate 有这种关系

@ManyToOne
private WorkoutTemplate belongingWorkout;

我想在我的数据库中插入一个 WorkoutTemplate... 我向控制器发送这样的 Json 请求:

{ "workoutName" : "My Workout",
concreteExercises: [
   {
"name" : "Squat"
   } 
 ]
}

DAO 将 WorkoutTemplate 插入我的数据库 并在 ConcreteExercise 的表中插入名称。 但不是对 WorkoutTemplate 的引用...... 实际上,表格 ConcreteExercise 由以下各项组成:

id, name, belongin_workout_id

根据上述请求,我们填充 id(自动增量)和名称,但不填充 WorkoutTemplate 的外键。

我该如何解决这个问题? 我想自动插入外键,而不是在请求中发送或手动将其插入服务中

【问题讨论】:

    标签: java mysql json spring-boot api


    【解决方案1】:

    您好,这是因为您没有使用 @JoinColumn 将列标记为实体关联或元素集合的连接列。

    在您的 WorkoutTemplate 实体上 - 您可以保留以下内容:

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "belongingWorkout", fetch = FetchType.LAZY)
    private List<ConcreteExercise> concreteExercises;
    

    但在您的 ConcreteExercise 实体上 - 您需要进行此更改:

    @ManyToOne
    @JoinColumn(name = "workout_template_id", nullable = false)
    private WorkoutTemplate belongingWorkout;
    

    以上代码将创建一个外键,将 ConcreteExercise 实体与 WorkoutTemplate 实体的主键链接起来。 ConcreteExercise 实体中的外键列的名称由 name 属性指定,在本例中为 workout_template_id - 随意更改。

    如果您已设置此功能但仍无法正常工作,那么分享代码 sn-p 以了解您如何保存这些内容也会有所帮助。

    【讨论】:

    • 是的,但是这样我必须在请求中将锻炼 ID 发送到 ConcreteExercise ... 否则会引发异常列 'workout_template_id' cannot be null
    • 我想在插入 WorkoutTemplate 后自动将锻炼 ID 插入到具体锻炼中,因为在插入锻炼模板之前我无法知道 ID 并将其放入请求中。这个过程应该是自动完成的
    • 如果您可以分享您的代码 sn-p 以了解您是如何执行此操作的,请查看您的请求,您正在传递锻炼的名称,对吗?因此,在您的服务中,您可以通过 findByName 存储库调用来获得锻炼,然后您现在可以从那里执行此操作 -> ConcreteExercise newExercise = new ConcreteExercise();然后foundWorkoutByName.getConcreteExercises().add(newExercise)。但是您必须小心按名称而不是主键 ID 查找 WorkoutTemplate 的性能。您需要通过使其唯一对其进行索引以加快搜索速度。
    猜你喜欢
    • 2020-04-03
    • 2017-02-08
    • 2019-03-09
    • 2018-07-04
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    • 2021-08-18
    相关资源
    最近更新 更多