当前位置: 首页 > 知识库问答 >
问题:

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

太叔何平
2023-03-14

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

实体类似于以下实体;

如果查看该表,它们不维护任何外键关系,也不共享相同的复合键,唯一的共同因素是zip\U code和school\U name列。我希望使用HIBERNATE注释定义与学校相对应的实体类,以便每次从DB检索学校的实体时,我还希望获得与该学校相关联的所有教师。我一直在参考一对多、二级表、联接表的示例来实现这一点,但它们都要求具有外键关系或共享复合id关系。

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

共有1个答案

蒋茂材
2023-03-14

使用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无关。只是不要期望如果一些老师引用未知的学校名称或邮政编码,这是外键约束允许阻止的。

 类似资料:
  • 问题内容: 我在为某些实体设置jpa映射时遇到麻烦。我有一个如下定义的父实体。 然后,我有一个带有复合键的子实体,以及此表的主键的外键,如下所示: 我知道子实体不正确,但是我不确定如何将其设置为具有复合PK。我知道我需要设置一个PK类,但是当一个字段是父类的外键时,我不确定该怎么做。一旦设置好,父级将如何引用子级实体? 任何帮助表示赞赏。 问题答案: 这受JPA 2规范的 第2.4.1节“与派生身

  • 问题内容: 我在这里搜索,但未找到任何类似的主题,因此我发布了一个新问题。 我正在使用现有数据库上的Hibernate。我们不允许更改表的结构和数据。该应用程序正在从数据库读取数据,并根据某种逻辑迁移到另一个数据存储。 现在的问题是关于复合PK映射。例如 表A具有复合PK。 表B也有一个复合PK,此复合PK的一部分是A的PK,此处也用作FK。 我尝试了几种方法,但都无济于事。谁能告诉一个有效的Hi

  • 我有以下MySQL表。这里的思想是轨道和课程是主键。并且轨道中的一个航向可能依赖于“同一轨道”中的另一个航向,因此我在(,)上创建了一个复合FK 但我在“depends_on_course_id column”中得到的结果都是空的,我猜getTrackCourse方法的映射有问题,但我不知道是什么?非常感谢任何帮助。

  • 我的数据库是: 我们可以在Table2中为Table1中的1设置多行。 我的TABLE1实体是: 我的Table1Id类是: 我的TABLE2实体是: 我的Table2Id类是: 当我尝试启动我的tomcat时,我有以下错误: 我尝试使用引用列,主键连接列和许多其他东西,但是通过在互联网上阅读它,它可以解决数据库建模问题。我认为问题是主键和外键在2个表中具有相同的名称,但我可能是错的......我

  • 我正在努力解决hibernate映射问题,即在订单表的主键和带有一些额外列的产品购物车的复合键之间映射一对多关系 产品购物车表具有组合键购物车ID和产品ID 我试着跟踪但没有成功 有人能帮我实现这一点吗?下面是错误消息 原因:组织。冬眠AnnotationException:非法尝试使用mappedBy关联pcoPK定义@JoinColumn。组织pk。冬眠cfg公司。Ejb3JoinColumn

  • 我在jpa/Hibernate中映射复合键时遇到了问题。父实体和子实体都具有复合主键。 在运行时保存它时会出现以下异常: 我认为这是虚假的,因为有getter和setter。如果在priceRequestLegModel上使用mappedby=“leg”,在allocationModel上使用@mapsid,也会出现同样的错误。有人能指出我在这里做错了什么吗?