是否可以在jpa中的辅助表上设置鉴别器列

时间:2012-11-07 18:10:01

标签: java jpa-2.0 eclipselink

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

我有两张桌子,类似于:

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

表1中的servicetype是表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 = ?”进行映射。

1 个答案:

答案 0 :(得分:1)

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

EclipseLink特定解决方案是使用自定义程序更改用于descriminator字段的表。将@Customizer标记添加到实体并使用方法指定类:

public void customize(ClassDescriptor descriptor) {
    descriptor.getInheritancePolicy().getClassIndicatorField().setTable(
        descriptor.getTable("table2"));
}