使用Hibernate映射没有外键/复合键关系的平面遗留表

时间:2014-06-04 14:20:45

标签: hibernate orm relational-database hibernate-mapping hibernate-annotations

我正在尝试使用Hibernate注释在遗留数据库中定义两个实体之间的映射。正在考虑的实体不共享外键/复合键,此时,修改旧表不是一种可能的选择:(

实体类似于以下内容;

enter image description here

如果查看表格,他们不会保持任何外键关系,也不会共享相同的复合键,唯一的常见因素是列zip_code和school_name。我希望使用HIBERNATE ANNOTATIONS定义我的实体类,使用HIBERNATE ANNOTATIONS,每次从DB中检索学校实体时,我也希望让所有教师都与该学校相关联。我一直试图通过一对多,辅助表,连接表的示例来实现这一点,但是所有这些都要求具有外键关系或共享复合ID关系。

请帮助我使用共同的专栏设置学校和教师之间的一对多关系"学校名称"和"邮政编码"。

1 个答案:

答案 0 :(得分:0)

您不需要任何外键来使用JPA映射关联。您只需在关联映射中引用相应的列及其引用的列:

@OneToMany
@JoinColumns({
    @JoinColumn(name="SCHOOL_NAME", referencedColumnName="NAME"),
    @JoinColumn(name="SCHOOL_ZIP", referencedColumnName="ZIP_CODE")
})
private Set<Teacher> teachers = new HashSet<>();

或者,如果您希望关联是双向的:

@OneToMany(mappedBy="school")
private Set<Teacher> teachers = new HashSet<>();

@ManyToOne
@JoinColumns({
    @JoinColumn(name="SCHOOL_NAME", referencedColumnName="NAME"),
    @JoinColumn(name="SCHOOL_ZIP", referencedColumnName="ZIP_CODE")
})
private School school;

是否存在外键约束与Hibernate无关。如果某位老师引用了一个未知的学校名称或邮政编码,那么就不要期望它能够完美地工作,这就是外键约束允许的阻止。