两个实体之间的共享主键不工作
Shared Primary Key between two Entities Not Working
我创建了两个实体Teacher和Detail,代码片段如下所示
Teacher.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
}
Detail.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
}
我正在尝试使用共享主键概念实现一对一映射
但是当我执行控制器时,只有老师 table 正在更新值
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();
}
仅执行教师 table 后更新为指定的 values.Detail table 仍然显示为空
它并不是那样工作的。您的 Detail
中仍然需要 id 字段,因此添加:
@Id
private long id;
给你的 Deatail
class.
并且 - 正如评论所建议的那样 - 将字段 Teacher
中的 @Id
注释替换为 @MapsId
。这样 Teacher
的 id 被映射到 Detail
的 id 但只有当你也将老师设置为细节时 - 你总是需要设置关系的双方 - 如:
teacher.setDetail(detail);
detail.setTeacher(teacher);
我创建了两个实体Teacher和Detail,代码片段如下所示
Teacher.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
}
Detail.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
}
我正在尝试使用共享主键概念实现一对一映射 但是当我执行控制器时,只有老师 table 正在更新值
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();
}
仅执行教师 table 后更新为指定的 values.Detail table 仍然显示为空
它并不是那样工作的。您的 Detail
中仍然需要 id 字段,因此添加:
@Id
private long id;
给你的 Deatail
class.
并且 - 正如评论所建议的那样 - 将字段 Teacher
中的 @Id
注释替换为 @MapsId
。这样 Teacher
的 id 被映射到 Detail
的 id 但只有当你也将老师设置为细节时 - 你总是需要设置关系的双方 - 如:
teacher.setDetail(detail);
detail.setTeacher(teacher);