Hibernate-带附加列的组合键的实现

时间:2019-01-05 20:29:56

标签: hibernate

比方说,我们正在为某个组织制作档案。在数据库的一部分中,我们将存储如下所示的会员职位历史记录

enter image description here

在Hibernate中执行此操作的一种方法是:

@Embeddable
public class CompositeKey implements Serializable {

    @ManyToOne
    private Employee employee;

    @ManyToOne
    private Position position;

    //the rest of the class
}


@Entity
@Table(name="EmployeePositions")
@AssociationsOverride({
        @AssiciationOverride(name="key.employee",
                joinColumns = @JoinColumn(name = "Employees_employee_id")),
        @AssiciationOverride(name="key.position",
                joinColumns= @JoinColumn(name="Positions_position_id"))
        })
public class EmployeePosition implements Serializable {

    @EmbeddedId
    private CompositeKey key;

    @Id
    @Column(name="begin_date")
    private Date begin_date;

    @Column(name="end_date")
    private Date end_date;

    //the rest of the class
}

//Employee and Position classes

另一个变体是

@Embeddable
public class CompositeKey implements Serializable {

    @Column(name="Employees_employee_id")
    private int employee_id;

    @Column(name="Positions_position_id")
    private int position_id;

    //the rest of the class
}


@Entity
@Table(name="EmployeePositions")
public class EmployeePosition {

    @EmbeddedId
    private CompositeKey key;

    @ManyToOne
    @JoinColumn(name="Employees_employee_id", referencedColumnName="employee_id")
    private Employee employee;

    @ManyToOne
    @JoinColumn(name="Positions_position_id", referencedColumnName="position_id")
    private Position position;

    @Id
    @Column(name="begin_date")
    private Date begin_date;

    @Column(name="end_date")
    private Date end_date;

    //the rest of the class
}

//Employee and Position classes

这两个示例在我的情况下均有效,并且给出的结果完全相同。我是Hibernate的新手,不完全了解注释的工作原理。问题是,这两种变体之间有什么区别,我应该使用哪一种?

0 个答案:

没有答案