1

我正在映射一个遗留数据库,其中一个表使用SINGLE_TABLE使用鉴别器列的映射自然地映射到继承层次结构。问题是有大量的鉴别器值!(此外,偶尔会添加新的,应用程序应该在多态查询中自动选择它们)。从我的应用程序的角度来看,我想以相同的方式对待绝大多数这些不同类型(即,只需将它们映射到继承层次结构中的基类)。但是,对于少数人,我想映射到特定的子类。问题是 JPA 似乎要求我在基类上提供一个特定@DiscriminatorValue的(否则它会生成一个默认的)。

具体来说:

@Entity
@Table("products")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "product_type")
@DiscriminatorValue( *anything not specified elsewhere!* )
public class Product {
    ...
    public double calculateMarkup() { ... default impl ... }
}
@Entity
@DiscriminatorValue("ProductA")
public class ProductA extends Product {
    ...
    @Override public double calculateMarkup() { ... specific impl ... }
}

有没有办法在 JPA(或 Hibernate 3.3 特定的扩展)中优雅地映射它?我能想到的唯一解决方案是放弃继承并将列映射为一个普通字段,在内部为特殊情况切换该值,但这感觉不自然而且有点脏。

4

3 回答 3

1

有没有办法在 JPA 中优雅地映射这个

不,不是我知道的。如果问题是在数据层(即数据或数据库)引起的,我会尝试在该层解决它。尝试以下两种方法之一:

  • 在数据库中创建一个与表相同的视图,除了“任何未在其他地方指定的内容”被映射*到默认鉴别器
  • 在表上编写一个插入/更新触发器,以Product修复每个 reacord* 的鉴别器值。

*Oracle 例如提供DECODE以将值从范围 A 映射到范围 B if-then-else-like。

于 2013-05-10T20:11:13.313 回答
1

我使用@DiscriminatorFormula( http://lauraliparulo.altervista.org/hibernate-inheritance/ )解决了同样的问题。判别器公式返回

CASE WHEN (product_type!='ProductA') THEN 'LEGACY'
ELSE product_type

并且 Product 实体具有 @DiscriminatorValue('LEGACY')

于 2017-04-07T10:01:22.667 回答
0

研究使用@ClassExtractor:http ://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Entities/Inheritance#Example:_Using_ClassExtractor_do_define_inheritance

就像是

public class ProductExtractor implements ClassExtractor {
    public void extractClassFromRow(Record row, Session session) {
        if (row.get("product_type").equals("ProductA")) {
            return ProductA.class;
        } 
        return Product.class;
    }
}

然后为您的类编写定制器并使用它们进行注释。

于 2014-08-05T19:32:07.457 回答