Java @任何:尚不支持

Java @任何:尚不支持,java,hibernate,jpa-2.0,Java,Hibernate,Jpa 2.0,我在一个已经成熟的项目中工作,所以我不能更改任何使用过的框架或库的任何版本 实际上,我有一个特殊的情况,我设法用两个实体和@heritation,@DiscriminatorColumn和@DiscriminatorValue解决了这个问题。现在,我有一个实体,在继承中引用了两个类,如下所示: @Entity //Other annotations public class A implements IA { //Class body } @Entity //Other annotat

我在一个已经成熟的项目中工作,所以我不能更改任何使用过的框架或库的任何版本

实际上,我有一个特殊的情况,我设法用两个实体和
@heritation
@DiscriminatorColumn
@DiscriminatorValue
解决了这个问题。现在,我有一个实体,在继承中引用了两个类,如下所示:

@Entity
//Other annotations
public class A implements IA {
    //Class body
}

@Entity
//Other annotations
public class B extends A implements IB { //Note: `IB` extends `IA`.
    //Class body
}

@Entity
//Other annotations
public class Container {
    private IA object1;
    private IA object2;
}
这里的问题是我试图使用@Any注释,因为
object1
和/或
object2
可以是
A
B
类型。我所做的是:

@Any(metaColumn=@Column(name="objectOneType", length=3),fetch=FetchType.EAGER)
@AnyMetaDef(idType="long",metaType="string", metaValues={
        @MetaValue(targetEntity=A.class, value="A"),
        @MetaValue(targetEntity=B.class, value="B")
    }
)
@JoinColumn(name = "relatedObjectId")
private IA object1;
如上所述,Hibernate的
@Any
注释系列在JPA2中没有对应的版本,而且,由于我无法切换到Hibernate 4.1,我在这里一直试图找到一种方法使其工作,或者我应该做些什么来修复它

一种“不那么优雅”的方法是创建一个新实体并将字段从A复制到B,删除继承并修复特定情况


也许,我正在失去JPA中一些我还不知道的特殊功能,所以我现在愿意接受并感谢任何可能为我指明正确方向的建议。

您不需要任何
@任何
注释。B扩展了A,因此B
是A。因此以下内容就足够了:

public class Container {
    @ManyToOne
    private A object1;

    @ManyToOne
    private A object2;
}
(假设协会是一个多人协会,也可能是一个多人协会)


Hibernate将自行确定这两个对象的具体类型,并将使用A或B的实例初始化object1和object2。

首先为什么需要它们?对A的引用可以指向A B,而无需做任何事情,因为B扩展了A。好吧,这将给我留下两个A元素,我必须找出每一种。。。现在我想知道,如果A的ID和它的一样,它会不会为B对象带来A-only字段,或者它会直接执行
A object1=new B()
?既然你提到了。。。我觉得我在这里有点“过度夸张”…两个字段的类型都是IA,所以你不知道它是哪种类型(A或B)。B扩展了A,所以B是A。虽然变量的类型是IA,但对象的实际类型可以是A或B。Hibernate将自己用适当的具体类型的实例填充引用。非常清楚,谢谢。想把这个作为回答吗?这就是我要去的地方。