当前位置: 首页 > 面试题库 >

带有部分组合主键的休眠外键

梁宪
2023-03-14
问题内容

我必须与Hibernate合作,但我不确定如何解决此问题,我有2个具有1..n关系的表,如下所示:

-------
TABLE_A
-------
col_b(pk)
col_c(pk)
[其他领域]

-------
TABLE_B
-------
col_a(pk)
col_b(pk)(fk TABLE_A.col_b)
col_c(fk TABLE_A.col_c)
[其他领域]

如何使用Hibernate进行管理?

我不知道如何声明将包含主键一部分的外键。

我的数据库架构是从Hibernate模型生成的。


问题答案:

我找到了解决此问题的两种方法。

第一个是一种解决方法,没有第二个那么整洁。

B实体的主键定义为包含col_acol_b和的复合键,col_c首先将假定为主键的内容定义为唯一约束。缺点是,从col_c概念上讲,该列实际上并不是主键的一部分。

@Entity
class A {
  @Id
  private int b;
  @Id
  private int c;
}

@Entity
@Table(uniqueConstraints = {@UniqueConstraint(columnNames = { "a", "b" }) })
class B {
  @Id
  private int a;

  @Id
  @ManyToOne(optional = false)
  @JoinColumns(value = {
          @JoinColumn(name = "b", referencedColumnName = "b"),
          @JoinColumn(name = "c", referencedColumnName = "c") })
  private A entityA;
}

第二个使用@EmbeddedId@MapsId注释,并且恰好做了我一开始想要做的事情。

@Entity
class A {
  @Id
  private int b;
  @Id
  private int c;
}

@Embeddable
class BKey {
  private int a;
  private int b;
}

@Entity
class B {
  @EmbeddedId
  private BKey primaryKey;

  @MapsId("b")
  @ManyToOne(optional = false)
  @JoinColumns(value = {
          @JoinColumn(name = "b", referencedColumnName = "b"),
          @JoinColumn(name = "c", referencedColumnName = "c") })
  private A entityA;
}


 类似资料:
  • 问题内容: 我使用Hibernate制作了一个示例应用程序。我的要求是表上没有主键。我只需要从应用程序中选择查询。我知道应该有一个主键,但是我所引用的表没有它。 它有大约5万条记录。因此,修改表以添加ID列将看不到可行的选项。 有可能吗 问题答案: Hibernate 要求 实体表具有主键。故事结局。 在谈论数据库时,5万条记录根本就不多。 我的建议:在表中添加一个自动增量整数PK列。您会对它的速

  • 问题内容: 一个表的外键是否可以成为另一个表的组合主键的一部分?例如,如果我有两个表,一个包含有关不同用户的所有活动项目的信息,另一个包含有关项目正在使用哪种设备的信息: 项目表: (两者都不是唯一的) 设备表: (两者都不是唯一的) 现在可以将设备表中的ProjectId设置为项目表中的外键吗?尝试时,我收到一条错误消息,指出“项目表”中的列与现有的主键或唯一约束不匹配? 问题答案: 不。 创建

  • 问题内容: 我得到了这个hibernate映射: 这是一个简单的复合键映射,具有与表productCoverage的关系以及与productterm的复合键。 现在问题出在我的搜索功能中: 这应该让我在“ id”(这是主键CoverageTermPK)上创建一个子条件,并对其添加限制,但是当我运行它时,我得到了错误消息: 这感觉很奇怪,难道不应该在那里得到CoverageTermPK吗?如果我尝试

  • 问题内容: 我有一个Catagory表,具有复合主键和外键。我的表结构就像 我想要像这样的Catagory类的ORM映射 现在如何注释 问题答案: 或而不是的版本(已通过Eclipselink 2.2.1测试):

  • 我在使用复合主键创建实体时遇到问题,该键也是外键。这是我的表和关系表原理图。当我想创建新闻实体时,我收到了带有null creatingnews的错误消息。新闻翻译有复合主键,外键引用到新闻表。 这是我的代码: 新闻聚合 新闻翻译 标签 新闻语言ID 在NewsFactory中,我希望使用NewsTranslation创建NewsAggregate,但有错误消息NullPointer。 新闻工厂

  • 我有以下表格,如何将它们映射到JPA实体: 事件表与会议表具有一对多的关系。我如何在JPA中映射这种双向关系?