Могу ли я создать статические методы в @MappedSuperclasses? - PullRequest
4 голосов
/ 30 декабря 2011

У меня есть абстрактный TemporalModel класс (помеченный @MappedSuperclass), который добавляет поля created и updated ко всем расширяющимся моделям.Я хочу добавить getLatest() статический метод к нему:

public static TemporalModel getLatest() {
    return find("order by created").first();
}

Когда я помещаю этот метод в базовый класс и вызываю его через конкретный класс (Transaction.getLatest()), я получаю ошибку:

Произошло UnsupportedOperationException: пожалуйста, аннотируйте вашу модель JPA аннотацией @ javax.persistence.Entity.

Я подозреваю, это потому, что JPA на самом деле не знает, что явызов этого метода «через» базовый класс (в Java нет реального наследования статических методов).

Есть ли другой способ реализовать этот метод один раз, вместо того, чтобы повторять его для всех классов сущностей?

Обновление - один из способов достижения этого (который я использую в другом более тяжелом приложении) описан здесь ( gist ).Однако в моем текущем приложении я не хотел бы использовать репозитории, и мне было интересно, есть ли другое, более легкое решение.

Ответы [ 2 ]

2 голосов
/ 29 декабря 2012

Конструкторы и статические методы никогда не могут быть абстрактными. Идея абстрактного класса заключается в создании чертежей методов, которые должны быть разработаны в подклассе (ах). Я предлагаю попробовать интерфейс TemporalModel вместо абстрактного класса, в котором вы создаете метод public static TemporalModel getLatest ();

1 голос
/ 29 декабря 2012

Я не использовал эту платформу Play, поэтому я не уверен в деталях здесь, но обычно, когда кто-то делает то, что вы хотите сделать, в Java, он просто указывает конкретный класс в качестве параметра длястатический метод в вопросе.Конечно, это немного уродливо, но это Java.

Я предполагаю, что этот find метод является статическим методом, который каким-то образом (посредством обработки аннотаций?) Добавляется этой средой для каждого расширяющегося класса, верно?В таком случае, я думаю, что единственным выходом для вас является сделать что-то вроде этого:

public static <T extends TemporalModel> T getLatest(Class<T> cl) {
    try {
        /* I don't know what type the find() method returns, so you'll have to fix the casting */
        return(cl.cast(cl.getMethod("find", String.class).invoke("order by created").first()));
    } catch(AllThosePeskyReflectionExceptions e) {
        throw(new Error(e));
    }
}

Я думаю, что это лучший доступный способ, учитывая помещение.Я знаю, что это некрасиво, поэтому я был бы рад ошибаться.:)

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