Hibernate не создает обратные сопоставления автоматически в сопоставлении сущностей @OneToMany - PullRequest
1 голос
/ 28 февраля 2020

Это мой родительский класс:

//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;
}

Теперь, если я пытаюсь сохранить викторину объекта со списком вопросов, оба объекта сохраняются , но сопоставление между Вопросом и Викториной не создается. Я ожидаю, что это отображение будет создано автоматически. Если мы вручную добавим сопоставление перед его сохранением, то увидим желаемое поведение.

Однако, если мы теперь удалим тест из объекта Вопрос и повторим тот же процесс, будут созданы таблицы соединения, что является ожидаемым поведение. Однако эти таблицы не заполняются. Даже если мы изменим исходное отображение на:

    @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- загрузки пускателя данных JPA

1 Ответ

1 голос
/ 28 февраля 2020

Это потому, что вы неправильно определили отображение. На родительской стороне у вас есть:

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

, поэтому вы объявляете, что в дочерней сущности есть поле ]a quiz`, которое содержит соединительный столбец, но его нет. Вы должны определить отображение для ребенка:

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