两个实体之间的共享主键不起作用
Posted
技术标签:
【中文标题】两个实体之间的共享主键不起作用【英文标题】:Shared Primary Key between two Entities Not Working 【发布时间】:2019-03-20 09:19:43 【问题描述】:我创建了Teacher和Detail两个Entity,代码sn-p如下所示
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
我正在尝试使用共享主键概念实现一对一映射 但是当我执行控制器时,只有教师表正在更新值
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();
执行后,仅用指定的值更新教师表。详细表仍显示为空
【问题讨论】:
尝试以下操作:(a) 将@PrimaryKeyJoinColumn
添加到Teacher.id
字段。 (b) 将Detail.teacher
字段上的@Id
替换为@MapsId
。
它不工作
【参考方案1】:
它不完全那样工作。您仍然需要Detail
中的 id 字段,因此添加:
@Id
private long id;
到您的Deatail
班级。
并且 - 正如评论所建议的那样 - 将字段 Teacher
中的 @Id
注释替换为 @MapsId
。这样Teacher
的 id 被映射到 Detail
的 id 但仅当您还将教师设置为详细信息时-您始终需要设置关系的双方-例如:
teacher.setDetail(detail);
detail.setTeacher(teacher);
【讨论】:
以上是关于两个实体之间的共享主键不起作用的主要内容,如果未能解决你的问题,请参考以下文章