如何在Hibernate的@Any中从值计算@ MetaValue的entityTarget?

时间:2012-03-19 14:25:12

标签: java hibernate hibernate-mapping

我已经实施了类似的解决方案: How to use Hibernate @Any-related annotations?,它已经失控 - 我有太多的映射具有类似的映射“方案”:

@Any(metaColumn = @Column(name = "something_type"), fetch = FetchType.LAZY)
@AnyMetaDef(idType = "long", metaType = "string", metaValues = {
    @MetaValue(value = "A", targetEntity = AImpl.class),
    @MetaValue(value = "B", targetEntity = BImpl.class),
    @MetaValue(value = "C", targetEntity = CImpl.class),
    @MetaValue(value = "D", targetEntity = DImpl.class),
    @MetaValue(value = "E", targetEntity = EImpl.class),
    etc..  })
public BaseSomething getRelatedSometing() {
    return relatedSometing;
}

我试图保持可以计算到目标的值(例如“A”)(例如“AImpl”)。 有没有办法避免手动列出所有实现,但仍然保持hibernate快乐?

1 个答案:

答案 0 :(得分:3)

I asked a similar question,希望得到Spring style meta-annotations的支持。

然而,与此同时,以下内容对我来说效果很好:

class SomeClass {
    public static final String SOMETHING_METADEF_NAME = "somethingMetadefName";


    @Any(metaColumn = @Column(name = "something_type"), fetch = FetchType.LAZY)
    @AnyMetaDef(idType = "long", metaType = "string", name=SomeClass.SOMETHING_METADEF_NAME,
    metaValues = {
            @MetaValue(value = "A", targetEntity = AImpl.class),
            @MetaValue(value = "B", targetEntity = BImpl.class),
            @MetaValue(value = "C", targetEntity = CImpl.class),
            @MetaValue(value = "D", targetEntity = DImpl.class),
            @MetaValue(value = "E", targetEntity = EImpl.class),
            etc..  })
    public BaseSomething getRelatedSometing() {
        return relatedSometing;
    }
}

    // Elsewhere
    @Any(metaColumn = @Column(name = "something_type"), fetch = FetchType.LAZY,
            metaDef=SomeClass.SOMETHING_METADEF_NAME)
    public BaseSomething getAnotherSomething() {
        return relatedSometing;
    }

具体来说,我定义了一次关系,并在name中给它一个@AnyMetaDef属性。然后,我可以从其他地方@Any(metaDef=MY_NAME)引用它。

希望这有帮助