环境: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 注解。但是 EclipseLink 中的解决方案是什么?
更新:数据模型图片澄清