【问题标题】:JPA 2.1 - mapping entity using a column valueJPA 2.1 - 使用列值映射实体
【发布时间】:2013-07-02 14:40:54
【问题描述】:

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

更新: 数据模型图片澄清

【问题讨论】:

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

标签: jpa java-ee-7


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 2021-09-13
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    相关资源
    最近更新 更多