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

问题描述 投票:0回答:1

我创建了两个实体,即教师和详细信息,代码片段如下所示

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
}

我正在尝试使用共享主键概念实现一对一映射,但是当我执行控制器时,只有Teacher表正在使用值进行更新

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

执行后只有教师表更新了指定的值。详细信息表仍显示为空

spring hibernate jpa orm hibernate-mapping
1个回答
0
投票

它并不完全像那样。你仍然需要你的Detail中的id字段,所以添加:

@Id
private long id;

到你的Deatail班。

而且 - 正如评论建议的那样 - 将字段@Id中的Teacher注释替换为@MapsId。这样,Teacher的id被映射到Detail的id但是如果你也将教师设置为细节 - 你总是需要设置关系的两面 - 如:

teacher.setDetail(detail);
detail.setTeacher(teacher);
© www.soinside.com 2019 - 2024. All rights reserved.