java - 是否可以在 jpa 的辅助表上有鉴别器列

标签 java jpa-2.0 eclipselink

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

我有两个表,类似这样:

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

表一中的servicetype是表二中服务类型的外键。 然而,表 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 试图在表 1 中查找 servicecategory 的值。

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

最佳答案

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

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

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

关于java - 是否可以在 jpa 的辅助表上有鉴别器列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13275578/

相关文章:

java - 将字符串添加到另一个类的数组列表中

java - 将数据库中的值填充到 javafx 中的 ObservableList

hibernate - JPA2 中分离对象的问题

java - JPA 2 和 Hibernate 之间有什么关系?

java - 标准 API : filter by class type

jpa - GlassFish 4/EclipseLink 延迟加载 @ManyToOne 关系失败

java - 将部分代码重构为 lambda 表达式

java - Android 蓝牙多个客户端连接一台主机

java - 通过 @XmlPath MOXy 注释解码嵌套集合

java - JPA - 为什么使用@JoinColumn?