如何使用EclipseLink在通用接口下为独立实体声明接口描述符?

时间:2011-04-04 15:06:42

标签: java jpa eclipselink

我们需要在一个属性下关联不同的实体,并在查询中使用此属性。 该项目使用 JPA EclipseLink 作为实现。

用于说明要点的示例代码:(实际问题要复杂得多)

interface I1 {
  public int getData();
}

@Entity
class E1 implements I1 {
  public int id;
  public String someData;

  public int getData() { return someData; }
}

@Entity
class E2 implements I1 {
  public int id;
  public String someOtherData;

  public int getData() { return someOtherData; }
}


@Entity
class Test {
  // we want to handle this as if it was a real entity using the I1 Interface
  // Since it is a oneToMany mapping we cannot use eclipselinks
  // VariableOneToOne mapping
  // something like this should be possible 
  // SELECT t.refToEntities From Test t where t.data == 'Some String'  
  public List<I1> refToEntities;
}

由于历史原因,实体不共享继承关系,但它们具有在公共接口下抽象出来的公共数据。 我们现在面临的问题是,我们有一个想要在一对多关系中使用公共接口与这些实体相关的另一个实体。理想情况下,关系应该可以使用JPQL查询,但使用EclipseLink特定方法也可以。

总结一下,我们希望为 OneToMany 关系提供 VariableOneToOne 映射。

到目前为止我发现的文档表明可以为接口构建 RelationalDescriptor ,但目前还不清楚如何在 JPA中将此描述符放入会话场景以及如何设置 InterfacePolicy ,以便将接口用作基础实体的通用类型。

所以有人知道如何做或者可以指出我们使用代码吗?

1 个答案:

答案 0 :(得分:1)

你可能最好使用继承而不是接口。

或者拥有每个实体类型的列表,而不仅仅是接口。

EclipseLink仅支持VariableOneToOne而不支持VariableOneToMany,请为此记录增强请求。

您可以使用SessionCustomizer为接口定义RelationalDescriptor,只需实例化它,使用descriptor.setJavaInterface(Il.class)设置接口并添加任何常用查询键。

您可以将此接口用作OneToManyMapping的目标(在代码中定义)。但是你无法在JPQL中加入它。