Java 如何使用EclipseLink为公共接口下的独立实体声明接口描述符?
在这种情况下,我们需要在一个属性下关联不同的实体,并在查询中使用该属性。 该项目使用JPA和EclipseLink作为实施 示例代码说明了这一点:(实际问题要复杂得多)Java 如何使用EclipseLink为公共接口下的独立实体声明接口描述符?,java,jpa,eclipselink,Java,Jpa,Eclipselink,在这种情况下,我们需要在一个属性下关联不同的实体,并在查询中使用该属性。 该项目使用JPA和EclipseLink作为实施 示例代码说明了这一点:(实际问题要复杂得多) 接口I1{ public int getData(); } @实体 类E1实现I1{ 公共int id; 公共字符串数据; public int getData(){return someData;} } @实体 类E2实现I1{ 公共int id; 公共字符串someOtherData; public int getData(
接口I1{
public int getData();
}
@实体
类E1实现I1{
公共int id;
公共字符串数据;
public int getData(){return someData;}
}
@实体
类E2实现I1{
公共int id;
公共字符串someOtherData;
public int getData(){return someOtherData;}
}
@实体
课堂测试{
//我们希望使用I1接口将其当作一个真实的实体来处理
//由于这是一个单一的映射,我们不能使用日食
//可变单子映射
//这样的事情应该是可能的
//从测试t中选择t.refToEntities,其中t.data=='Some String'
公共列表参考实体;
}
由于历史原因,这些实体不共享继承关系,但它们具有公共数据,这些数据在公共接口下被抽象出来。
我们现在面临的问题是,我们有另一个实体,它希望在一对多关系中使用公共接口与这些实体关联。理想情况下,应该可以使用JPQL查询关系,但是使用EclipseLink特定的方法也可以
总而言之,我们希望为一个一个域关系建立一个可变的一个域映射
到目前为止,我找到的文档表明,可以为接口构建一个关系描述符,但不清楚如何在JPA场景中将该描述符引入会话,以及如何设置接口策略,以便将接口用作会话的通用类型基础实体
那么,有人知道如何做到这一点,或者可以告诉我们如何使用工作代码吗?您最好使用继承而不是接口 或者有每个实体类型的列表,而不仅仅是接口 EclipseLink仅支持VariableOneToOne而不支持VariableOneToMany,请为此记录增强请求 您可以使用SessionCustomizer为接口定义RelationalDescriptor,只需实例化它,使用descriptor.setJavaInterface(Il.class)设置接口并添加任何公共查询键
您可能会将此接口用作OneToNameApping(在代码中定义)的目标。不过,您将无法在JPQL中跨它连接。您最好使用继承而不是接口 或者有每个实体类型的列表,而不仅仅是接口 EclipseLink仅支持VariableOneToOne而不支持VariableOneToMany,请为此记录增强请求 您可以使用SessionCustomizer为接口定义RelationalDescriptor,只需实例化它,使用descriptor.setJavaInterface(Il.class)设置接口并添加任何公共查询键 您可能会将此接口用作OneToNameApping(在代码中定义)的目标。不过,您将无法在JPQL中跨它加入
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;
}