gpt4 book ai didi

java - 用 SQL 替换 JPA/Hibernate DiscriminatorColumn

转载 作者:行者123 更新时间:2023-11-29 05:49:35 28 4
gpt4 key购买 nike

我必须维护一些用于管理某些数据库表的 JPA/Hibernate 代码。我有一个这样的类层次结构:

@Entity
@Table(name="table_name")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="column_name", discriminatorType=DiscriminatorType.STRING)
public abstract class AbstractBaseClass {...}

@Entity
@DiscriminatorValue("N")
public class SubClass1 extends AbstractBaseClass { ...}

@Entity
@DiscriminatorValue("Y")
public class SubClass2 extends AbstractBaseClass { ...}

一切正常,但数据库正在重新设计,歧视列将被删除,记录的类型将由 SQL 查询确定。这种重新设计不是我的主意,我无法控制数据库结构。由于现有的代码库,更改 Java 层次结构也不切实际。我可以使用什么来代替 DiscriminatorColumn/DiscriminatorValue 以便一切继续正常工作?

最佳答案

如果你对表格设计完全没有影响,而 future 的设计会让人大吃一惊,那么情况看起来就很惨淡:)

但也许您仍然可以使用您的实体并稍加改动。好消息是,除了 SINGLE_TABLE - JOINEDTABLE_PER_CLASS 之外,JPA 还提供了 2 个继承映射模型。

JOINED:您最终会得到三个表,每个实体一个,包括抽象表。这些表将准确包含相应类中包含的属性。要访问不同的类型,提供者必须访问(和连接)不同的表,因此不需要鉴别器列。

TABLE_PER_CLASS:您将有两个表,每个表对应您的具体子类。它们中的每一个都将映射抽象父类的所有属性加上它们自己的属性。和以前一样,提供者将使用单独的表,因此不需要鉴别器。

为了进行转换,你必须改变线路

@Inheritance(strategy=InheritanceType.SINGLE_TABLE)

要么

@Inheritance(strategy=InheritanceType.JOINED)

@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)

JPQL 查询的好处是它们根本不需要更改。只需使用 JPQL TYPE 关键字,提供者就会完成所有映射。

编辑:还有一件事 - 如果您必须处理单个表但没有鉴别器,并且类型将由连接确定,您可以使用像这样的 JPQL 构造函数表达式:

SELECT NEW com.example.SubClass1(e.name, e.address) FROM CommonSurrogateEntity e, TypeHintEntity t WHERE t.type = e.foreignKey

CommonSurrogateEntity 将是一个假类,映射整个公用表。 TypeHintEntity 就是您在评论中提到的另一个表。

关于java - 用 SQL 替换 JPA/Hibernate DiscriminatorColumn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14442101/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com