双向一对一映射

时间:2020-12-30 06:10:38

标签: hibernate hibernate-mapping

@Entity
@Table(name="Instructor")
public class Instructor {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")
    private int id;
    
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "detail_id")
    private InstructorDetails detail;
    
    @Column(name="name")
    private String name;
}

这是我的第一个实体类,这个类确实包含所需的 setter、getter 和构造函数,我没有包括它们,因为它们会使问题变得冗长

@Entity
@Table(name="InstructorDetails")
public class InstructorDetails {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "did")
    private int did;
    
    @OneToOne(mappedBy = "detail",cascade = CascadeType.ALL)
    private Instructor instructor;
    
    @Column(name = "address")
    private String address;
    
    @Column(name = "course")
    private String course;
    
    @Column(name = "hobby")
    private String hobby;
    
    @Column(name = "dept")
    private String dept;
}

这是我的第二个实体类,这个类确实包含所需的 setter、getter 和构造函数,我没有包括它们,因为它们会使问题变得冗长

如您所见,我已尝试执行双向一对一映射, 我已经清楚地提到了 cascade=CascadeType.ALL,这意味着发生在一个表中的所有操作都级联到另一个表中,我试图通过包含 @OneToOne(mappedBy = "detail", cascade = CascadeType.ALL)

来执行双向映射

这里的问题是

Session session = sf.getCurrentSession(); 
session.beginTransaction();

InstructorDetails detail=new InstructorDetails("bengaluru", "Java", "Guitar", "development");
Instructor instructor=new Instructor("john",detail);

session.save(instructor);
session.getTransaction().commit();

此代码将详细信息同时推送到 InstructorInstructorDetails 表中,但如果

Session session = sf.getCurrentSession(); 
session.beginTransaction();

Instructor instructor=new Instructor();
instructor.setName("Sam");
InstructorDetails detail=new InstructorDetails("bengaluru", "Java", "Guitar", "development");
detail.setInstructor(instructor);
    
session.save(detail);
session.getTransaction().commit();

此代码仅将数据推送到 InstructorDetails 表中,Instructor 表未更新教师详细信息,这意味着映射是单向的

Instructor 上的所有 CRUD 操作都级联到 InstructorDetails,但我无法实现反之亦然,请在这里帮助我,我如何确保 InstructorDetails 上执行的所有 CRUD 操作{1}} 也会影响 Instructor

1 个答案:

答案 0 :(得分:1)

正如它在休眠documentation中所述:

<块引用>

无论何时形成双向关联,应用程序开发人员都必须确保双方始终保持同步。

因此,您应该通过以下方式更正您的代码:

Session session = sf.getCurrentSession(); 
session.beginTransaction();

Instructor instructor = new Instructor();
instructor.setName("Sam");
InstructorDetails detail = new InstructorDetails("bengaluru", "Java", "Guitar", "development");

// sync both side of association
detail.setInstructor(instructor);
instructor.setDetail(detail);

session.save(detail);
session.getTransaction().commit();
相关问题