1

环境: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 中的解决方案是什么?

更新:数据模型图片澄清

在此处输入图像描述

4

1 回答 1

1

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

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

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

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

于 2013-07-03T12:58:49.210 回答