2012-11-23 38 views
-1

我正在一个已经成长的项目中工作,所以我将无法更改任何使用过的框架或库的任何版本。@任何:不支持

其实,我有一个特殊的情况,我设法解决与两个实体和@Inheritance,@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可以的键入AB。我所做的是这样的:

@Any([email protected](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; 

如前所述here,Hibernate的@Any注释族在JPA 2中没有对应和,因为我不能切换到Hibernate 4.1,我坚持在这里试图找出一种使它工作的方式,或者我应该怎么做来解决它。

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

也许,我在JPA中失去了一些我还不知道的特殊功能,所以我现在对此表示欢迎,并且感谢任何可能指向正确方向的建议。

+0

为什么你需要首先放置?对A的引用可以指向B,而不需要做任何事情,因为B扩展为A. –

+0

那么,那会给我带来两个A元素,我必须弄清楚每种...现在我想知道,如果A具有ID,因为它不会为B对象带来A-only字段,还是会直接执行'A object1 = new B()'?现在你提到它了......我觉得我在这里是一种“过度防御”...... – Gamb

+1

这两个字段的类型都是IA,所以你不知道它是哪种类型(A或B)。 B扩展了A,所以B **是** A.虽然变量的类型是IA,但是对象的实际类型可以是A或B.Hibernate将填充具有适当具体类型的实例的引用all通过它自己。 –

回答

2

您不需要任何@Any注释。 B扩展A,所以B is一个A.所以下面就足够了:(假设关联是一个多对一它也可以是一个OneToOne)

public class Container { 
    @ManyToOne 
    private A object1; 

    @ManyToOne 
    private A object2; 
} 

Hibernate会找出具体类型的这两个对象都是自己的,并且将用A或B的实例初始化object1和object2。