首页 > 解决方案 > Hibernate 不会在 @OneToMany 实体映射中自动创建回映射

问题描述

这是我的父类:

//relevant imports

@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class Quiz {


    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(unique = true)
    private Long id;

    private long questionPublished;
    private long questionNeverPublished;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "quiz")
    @LazyCollection(LazyCollectionOption.FALSE)
    private List<Question> questionAnalytics;
}

儿童班:

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity
public class Question {

    private Long questionId;

// the inverse mapped entity was both added and removed and the back mapping didn't work in both cases

    @ManyToOne(fetch = FetchType.EAGER)
    private QuizAnalytics quizAnalytics;

// till here
    @ElementCollection(fetch = FetchType.EAGER)
    @Fetch(value = FetchMode.SUBSELECT)
    private List<Long> attemptedLearners;
}

现在,如果我尝试使用问题列表保存对象 Quiz,这两个对象都会被保留,但不会创建 Question 和 Quiz 之间的映射。我期望这个映射会自动创建。如果我们在持久化之前手动添加映射,就会看到理想的行为。

但是,如果我们现在从 Question 对象中删除 Quiz,并重试相同的过程,则会创建 Join 表,这是预期的行为。但是,这些表不会被填满。即使我们将初始映射修改为:

    @OneToMany(cascade = CascadeType.ALL)
    @LazyCollection(LazyCollectionOption.FALSE)
    @JoinColumn(name = question_id_join_column)
    private List<QuestionInDepth> questionInDepthAnalytics;

即使在这种情况下,question_id_join_column 也不会更新。

我正在使用 SpringBoot v2.2.0 和与 spring-boot-starter-data-jpa 关联的默认休眠

标签: javaspringspring-bootspring-datahibernate-mapping

解决方案


这是因为您定义了错误的映射。在父母方面,您有:

@OneToMany(cascade = CascadeType.ALL, mappedBy = "quiz")

所以你要声明,子实体中有]aquiz` 字段,它包含连接列,但没有。您必须为孩子定义一个映射:

@ManyToOne
@JoinColumn(name = "quiz_id")
private Quiz quiz;

推荐阅读