spring - 两个实体之间的共享主键不起作用
问题描述
我创建了两个实体,即 Teacher 和 Detail,代码片段如下所示
教师.java
@Entity
@Table(name = "teacher")
public class Teacher implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private long id;
@Column(name = "name")
private String name;
@Column(name = "age")
private int age;
@OneToOne(mappedBy = "teacher", cascade = CascadeType.ALL)
private Detail detail;
public Teacher() {
}
public Teacher(String name, int age) {
this.name = name;
this.age = age;
}
//getter and setter
}
细节.java
@Entity
@Table(name = "detail")
public class Detail implements Serializable {
@Id
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "id")
private Teacher teacher;
@Column(name = "subjects")
private String subjects;
public Detail() {
}
public Detail(String subjects) {
this.subjects = subjects;
}
//getter and setter
}
我正在尝试使用共享主键概念实现一对一映射,但是当我执行控制器时,只有教师表正在更新值
try {
Teacher teacher=new Teacher("xyz",23);
Detail detail=new Detail("Java,c,c++");
teacher.setDetail(detail);
session.beginTransaction();
session.save(teacher);
session.getTransaction().commit();
model.addAttribute("added", "data inserted");
session.close();
}
执行后只用指定的值更新教师表。详细表仍显示为空
解决方案
它不完全那样工作。您仍然需要 id 字段Detail
,因此添加:
@Id
private long id;
到你的Deatail
班级。
并且 - 正如评论所建议的那样 - 将@Id
字段中的注释替换Teacher
为@MapsId
. 这样,只有当您还将教师设置为详细信息时,Teacher
才会将 id 映射到 id Detail
- 您始终需要设置关系的双方 - 例如:
teacher.setDetail(detail);
detail.setTeacher(teacher);
推荐阅读
- reactjs - 在 React 中更改输入的占位符
- javascript - 使用 javascript 客户端 sdk 和 Angular 启动对话客户端、加入对话以及订阅 twilio 上的对话更改
- excel - 将文本值映射到数字
- kotlin - 如何从 kotlin 中的谷歌材料时间选择器获取 am/pm 值
- angular - 如何使用从 api 接收的数组中的元素填充 mat-option
- python - 如何使用 Matplotlib 在 Python 中沿无花果添加扩展箭头
- reactjs - CopyWebpackPlugin 到 react webpack 应用程序中的 dist 文件夹
- android - Samsung Internet (Chromium) 未正确显示网站顶部
- python - 计算给定列表中所有可能的组合
- python - Python:排序列表和保留索引的最快方法