JPA 2.1-使用列值映射实体

JPA 2.1-使用列值映射实体,jpa,java-ee-7,Jpa,Java Ee 7,环境:EE7/JPA 2.1(Glassfish 4/EclipseLink 2.5) 给定以下数据库表: +-------------+ | Foo | +=============+ | id | | ... | +-------------+ +-------------+ | Bar | +=============+ | id | | ... | +-------------+ +-

环境:EE7/JPA 2.1(Glassfish 4/EclipseLink 2.5)

给定以下数据库表:

+-------------+
| Foo         |
+=============+
| id          |
| ...         |
+-------------+

+-------------+
| Bar         |
+=============+
| id          |
| ...         |
+-------------+

+-------------+
| Baz         |
+=============+
| id          |
| ...         |
+-------------+

+-------------+
| Parameter   |
+=============+
| id_generic  |
| type        |
| ...         |
+-------------+

'type' specifies the concrete table with 'id_generic' being the PrimaryKey of it.
在JPA/EclipseLink中绘制这样一个结构的正确方法是什么

一种可能的解决方案是使用人工继承层次结构,如

@...
@Inheritance(strategy=SINGLE_TABLE)
@DiscriminatorColumn(name="type"...)
public abstract class Parameter {...}

@...
@DiscriminatorValue("FOO")
public class FooParameter {...}

@...
@DiscriminatorValue("BAR")
public class BarParameter {...}

@...
@DiscriminatorValue("BAZ")
public class BazParameter {...}
但这在我看来相当“丑陋”,因为不同的子类没有任何不同

我知道,还有其他一些特定于实现的解决方案,比如在@joincolm-like中使用常量值

@JoinColumns({
    @JoinColumn(name="Foo.ID" referencedColumnName="id_generic"),
    @JoinColumn(name="type" referencedColumnName="'FOO'") //FOO as constant value
});
private...
或者Hibernate中的@Where注释。但在日食中,解决方案是什么呢

更新: 用于澄清的数据模型图片


,可以考虑在EclipseLink使用@变量abutoOne映射,

或者在映射的选择条件中使用表达式


,可以考虑在EclipseLink使用@变量abutoOne映射,

或者在映射的选择条件中使用表达式


不清楚你到底想要什么。您希望在应用程序中使用的实体模型是什么?为什么foo/bar/baz子类不适合您的需要?如果Foo/Bar/Baz表完全相同,为什么不将它们放在一个表中呢?这些信息是只读的吗?它们不一样,只是伪代码。对不起,我想用“…”替换其他列/属性就可以清楚地看到这一点。Foo/Bar/Baz(同样,不是真名;-))不是问题所在。这是参数表/实体,这给我带来了一些麻烦。我希望Foo/Bar/Baz实体包含单个参数实体,该实体通过相应参数表中的组合id_generic/type列确定。听起来像Foo扩展参数是您想要的,因为所有参数数据和逻辑都包含在其中。单表继承或联接表继承可以为您设置类型字段。如果在设置时遇到问题,请显示设置和问题。另一种方法是将Foo reference参数设置为1:1,但在进行引用时必须在参数中设置type字段。感谢您的帮助,但这并不是我想要的,因为Foo/Bar/Baz是不相关的。也许我的“变通方法”——使用人工参数继承的示例让您感到困惑。我真正想要的是一种符合标准的或者至少是EclipseLink的变体:不清楚你到底想要什么。您希望在应用程序中使用的实体模型是什么?为什么foo/bar/baz子类不适合您的需要?如果Foo/Bar/Baz表完全相同,为什么不将它们放在一个表中呢?这些信息是只读的吗?它们不一样,只是伪代码。对不起,我想用“…”替换其他列/属性就可以清楚地看到这一点。Foo/Bar/Baz(同样,不是真名;-))不是问题所在。这是参数表/实体,这给我带来了一些麻烦。我希望Foo/Bar/Baz实体包含单个参数实体,该实体通过相应参数表中的组合id_generic/type列确定。听起来像Foo扩展参数是您想要的,因为所有参数数据和逻辑都包含在其中。单表继承或联接表继承可以为您设置类型字段。如果在设置时遇到问题,请显示设置和问题。另一种方法是将Foo reference参数设置为1:1,但在进行引用时必须在参数中设置type字段。感谢您的帮助,但这并不是我想要的,因为Foo/Bar/Baz是不相关的。也许我的“变通方法”——使用人工参数继承的示例让您感到困惑。我真正想要的是一种符合标准或至少是EclipseLink的变体: