java 根据列的值引用一个表或另一个表的Hibernate变量

k75qkfdt  于 2023-11-15  发布在  Java
关注(0)|答案(1)|浏览(93)

首先,你必须知道我正在使用一个糟糕的数据库设计,但它不在我的手中。有一个表PART_TAB,它的列FK_elex可以包含对表PART或表OPERATION的记录的引用。表PART_TAB有另一个名为elart的列,它包含“Part”或“Operation”来指示FK_elex引用的表。
我必须用Hibernate来Map它。我创建了一个名为Article的超类和两个子类Article和Operation。ArticleMap表PART和Operation表OPERATION。然后我有一个MapPART_TAB的类Subarticle。在Subarticle中,我创建了一个类型为Article的变量来表示FK_elex,并且应该根据列elart来注解指向Article或Operation。
如果只有一个变量是不可能的,我想创建两个,一个指向Article,另一个指向Operation,但是它们都使用同一列,我不知道如何注解它。
有人能给我指个路吗?谢谢!

lmvvr0a8

lmvvr0a81#

我不是100%的工作,但如何:MapPART_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;

}

字符串
然后你有几个处理多态性的选择,比如简单的instanceofs,或者使PartTab成为泛型,或者在抽象类上引入isArticle()isOperation(),等等。

相关问题