Hibernate 变量,引用一个表或另一个表,具体取决于列的值

Hibernate variable with reference to one table or another depending on the value of column

提问人:Nessarose 提问时间:11/13/2023 更新时间:11/13/2023 访问量:23

问:

首先,你必须知道我正在使用一个糟糕的数据库设计,但它超出了我的控制范围。有些表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,但它们都使用同一列,我不知道如何注释它。

有人能为我指出正确的方向吗? 谢谢!

java sql 休眠

评论


答:

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()