Как вычислить entityTarget @ MetaValue из значения в @Any Hibernate? - PullRequest
2 голосов
/ 19 марта 2012

Я реализовал решение, похожее на: Как использовать аннотации, связанные с Hibernate @ Any? , и оно выходит из-под контроля - у меня слишком много сопоставлений, которые имеют похожую "схему" сопоставления:

@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»).Есть ли способ избежать перечисления всех реализаций от руки, но при этом держать счастливым спящий режим?

1 Ответ

3 голосов
/ 20 ноября 2012

Я задал похожий вопрос , надеясь на поддержку Метааннотации в стиле Spring .

Однако, тем временем следующее хорошо работает для меня:

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) в другом месте.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...