提问人:Nessarose 提问时间:11/13/2023 更新时间:11/13/2023 访问量:23
Hibernate 变量,引用一个表或另一个表,具体取决于列的值
Hibernate variable with reference to one table or another depending on the value of column
问:
首先,你必须知道我正在使用一个糟糕的数据库设计,但它超出了我的控制范围。有些表PART_TAB具有列FK_elex,该列可以包含对表 PART 或表 OPERATION 的记录的引用。表 PART_TAB 有另一列名为 elart,其中包含“Part”或“Operation”,以指示FK_elex引用哪个表。
我必须用 Hibernate 映射它。我创建了一个名为 Ingredient 的超类和两个子类 Article 和 Operation。文章映射表 PART 和操作表 OPERATION。然后我有映射PART_TAB类 Subarticle。在 Subarticle 中,我创建了一个 Ingredient 类型的变量来表示FK_elex,并且应该根据列 elart 注释为点 Article 或 Operation。
关于如何做到这一点的任何想法?如果不可能只有一个变量,我正在考虑创建 2 个,一个指向 Article,另一个指向 Operation,但它们都使用同一列,我不知道如何注释它。
有人能为我指出正确的方向吗? 谢谢!
答:
0赞
Simon
11/13/2023
#1
我不是 100% 这可行,但是怎么样:将PART_TAB映射为多态单表。
@Entity
@Table(name="PART_TAB")
@DiscriminatorColumn(name="elart", discriminatorType=DiscriminatorType.STRING)
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
abstract class PartTab {
}
@Entity
@DiscriminatorValue(value="Part")
class PartTabPart extends PartTab {
@ManyToOne(targetEntity=Article .class)
@JoinColumn(name="FK_elex", nullable=true)
@Fetch(FetchMode.SELECT)
private Article article;
}
@Entity
@DiscriminatorValue(value="Operation")
class PartTabOperation extends PartTab {
@ManyToOne(targetEntity=Operation.class)
@JoinColumn(name="FK_elex", nullable=true)
@Fetch(FetchMode.SELECT)
private Operation operation;
}
然后,您有几种选择如何处理多态性。粗略的实例,或使 PartTab 成为泛型,或引入抽象类,仅举几例。isArticle()
isOperation()
评论