java - 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 关联的默认休眠
解决方案
这是因为您定义了错误的映射。在父母方面,您有:
@OneToMany(cascade = CascadeType.ALL, mappedBy = "quiz")
所以你要声明,子实体中有]a
quiz` 字段,它包含连接列,但没有。您必须为孩子定义一个映射:
@ManyToOne
@JoinColumn(name = "quiz_id")
private Quiz quiz;
推荐阅读
- excel - 通过将 A 列的值从 sheet2 匹配到 A 列 sheet1,复制 sheet2 的 B 列
- ruby-on-rails - 如何使用 Ruby 获得 JWT?
- spring - 仅将实体的一个字段保存到另一个表
- r - 在 jupyter R docker 中安装 systemfonts 时出现致命错误
- reactjs - 如何在 ReactJs 中将渲染的元素放置在 div 中
- docker - 未创建 Docker 命名卷
- python - 获取类型错误:int 类型的参数在 Python 中不可迭代
- android - 我的应用程序中的 TextInput 使我的键盘永久滞后
- python - SVM+HOG目标检测器
- c++ - C++:构建多功能计算器