环境: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图片以供澄清
答案 0 :(得分:1)
您可以考虑在EclipseLink中使用@VariableOneToOne映射,
http://eclipse.org/eclipselink/documentation/2.5/jpa/extensions/a_variableonetoone.htm
或在地图的选择标准中使用表达式
http://wiki.eclipse.org/EclipseLink/Examples/JPA/MappingSelectionCriteria