5

我目前正在努力将现有的数据库模式映射到 jpa 实体,并且在很多奇怪的情况下,我已经陷入了这个问题。

我有两个表,类似于:

Table 1          Table 2         
|Service     |  |Servicetype     |
|servicetype |  |Servicecategory |
|            |  |                |

其中servicetype表 1 是表 2 中服务类型的外键。但是,表 1 中的服务根据它们所属的类别具有截然不同的行为(虽然有 100 多种服务类型,但只有 4 个类别)我希望能够将表 1 映射到四个不同的实体类,基于其服务类型的类别。

这是我到目前为止所拥有的:

@Entity
@Table(name = "table1")
@DiscriminatorColumn(name = "servicecategory", discriminatorType =         
     discriminatorType.INTEGER)
@DiscriminatorValue("1")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@SecondaryTable(name = "table2",
pkJoinColumns =
 @PrimaryKeyJoinColumn(name = "servicetype", referencedColumnName = 
"servicetype"))
public class AbstractService implements Serializable {
...etc

并且从这个扩展了 4 个类,但是有一个不同的discriminatorvalue,这是行不通的,因为我正在使用的 eclipselink 试图在 table1 中查找 servicecategory 的值。

是否可以用 jpa 表达这样的映射,或者我应该只where servicecategory = ?在每个查询上用 " " 进行映射。

4

1 回答 1

1

请在 EclipseLink 中提交增强以添加对此功能的支持。JPA 解决方案是用辅助表切换主表 - 这可能会导致插入顺序出现问题,并且外键将引用 table2 中的服务类型。

一个 EclipseLink 特定的解决方案是使用定制器来更改用于描述符字段的表。将@Customizer 标记添加到实体并指定具有方法的类:

public void customize(ClassDescriptor descriptor) {
    descriptor.getInheritancePolicy().getClassIndicatorField().setTable(
        descriptor.getTable("table2"));
}
于 2012-11-08T14:55:04.207 回答