两个实体之间的共享主键不起作用

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);

【讨论】:

以上是关于两个实体之间的共享主键不起作用的主要内容,如果未能解决你的问题,请参考以下文章

实体框架核心外键不起作用

在两个控件之间共享绑定源不起作用

两个活动之间的共享数组列表不起作用

具有复合主键查询的 JPA COUNT 不起作用

在目标之间共享 UserDefault 不起作用

LEFT JOIN FETCH 不起作用 - Spring 数据 JPA