我已经实施了类似的解决方案: 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快乐?
答案 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)
引用它。
希望这有帮助