【问题标题】:Using Hibernate to map flat legacy tables with NO foreign key / Composite key relation使用 Hibernate 映射没有外键/复合键关系的平面遗留表
【发布时间】:2014-07-25 06:07:59
【问题描述】:

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

实体与以下类似;

如果您查看该表,它们不会维护任何外键关系并且也不共享相同的复合键,唯一的共同因素是列 zip_code 和 school_name。我想使用 HIBERNATE ANNOTATIONS 定义与 SCHOOL 对应的实体类,这样每次从数据库中检索学校实体时,我还想获取与该学校相关联的所有教师。我一直在尝试通过一对多、辅助表、连接表的示例来实现这一点,但所有这些都要求具有外键关系或共享复合 ID 关系。

请帮助我使用常用​​列“学校名称”和“邮政编码”设计学校和教师之间的一对多关系。

【问题讨论】:

  • 您是否注意到,实际上您并没有提出任何真正的问题?
  • Erwin- 我刚刚编辑了我的帖子并添加了一个问题。我正在寻求帮助,以使用常用列“学校名称”和“邮政编码”来设计学校和教师之间的一对多关系。

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


【解决方案1】:

您不需要任何外键来使用 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 无关。只是不要指望如果某些老师引用未知的学校名称或邮政编码,它会完美地工作,这是外键约束允许防止的。

【讨论】:

  • 如您的回复中所述尝试了 1-many(单向),但出现此异常; failed.org.hibernate.AnnotationException:edu.Teacher.teachers 的referencedColumnNames(SCHOOL_NAME, SCHOOL_ZIP) 引用edu.School 未映射到单个属性。我在网上搜索以检查这一点,并被定向到提到只有当@JoinColumns 包含作为实体 School 的复合键的一部分的所有列时才能进行表连接的帖子。 stackoverflow.com/questions/21536095/…
  • 首先道歉 - 迟到的回复,非常感谢您对此的投入。仍在寻找解决此问题的方法 - 感谢您对此的宝贵意见。
猜你喜欢
  • 2020-06-25
  • 2011-03-20
  • 2011-05-29
  • 1970-01-01
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多