-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 注释,因为object1and/orobject2可以是Aor类型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注释系列在 JPA 2 中没有对应物,并且由于我无法切换到 Hibernate 4.1,因此我被困在这里试图找出一种使其工作的方法或我应该如何修复它。

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

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

4

1 回答 1

2

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

public class Container {
    @ManyToOne
    private A object1;

    @ManyToOne
    private A object2;
}

(假设关联是多对一。它也可能是一对一)

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

于 2012-11-23T18:12:03.927 回答