JPA 2.1 - 使用列值映射实体

时间:2013-07-02 14:40:55

标签: jpa java-ee-7

环境: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 {...}

但这对我来说似乎相当“丑陋”,因为不同的子类在任何方面都没有区别。

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

@JoinColumns({
    @JoinColumn(name="Foo.ID" referencedColumnName="id_generic"),
    @JoinColumn(name="type" referencedColumnName="'FOO'") //FOO as constant value
});
private...

或Hibernate中的@Where Annotation。但是EclipseLink中的解决方案是什么?

更新: DataModel图片以供澄清

enter image description here

1 个答案:

答案 0 :(得分:1)

您可以考虑在EclipseLink中使用@VariableOneToOne映射,

http://eclipse.org/eclipselink/documentation/2.5/jpa/extensions/a_variableonetoone.htm

或在地图的选择标准中使用表达式

http://wiki.eclipse.org/EclipseLink/Examples/JPA/MappingSelectionCriteria