Как динамически заполнить аннотацию - PullRequest
4 голосов
/ 21 июня 2010

К сожалению, я забыл взять код с работы со мной сегодня. Но, возможно, этот маленький пример прояснит ситуацию.

Я использую hibernate для сопоставления бина с таблицей.

Пример:

import javax.persistence.column;
….
String columnameA;
….
@Column(name="columnameA")
public String getColumname(){
  return columnameA
}
….

Я не хочу жестко кодировать имя столбца (« columnameA ») в моем исходном коде, потому что мне нужно переключить имя столбца без построения всего проекта. Я хотел использовать что-то вроде:

@Column(name=getColumnName())

Это не работает. Идея состоит в том, чтобы написать имя столбца где-нибудь в дереве jndi и использовать его при запуске. Поэтому мне нужно только перезапустить приложение, чтобы изменить имя столбца.

Единственный способ обойти эту проблему - о которой я могу подумать - это написать собственную аннотацию, которая расширяет класс hibernate. Есть ли более простой способ сделать это?

Ответы [ 2 ]

1 голос
/ 22 июня 2010

Вы не можете достичь этого с помощью аннотаций, но решение вашей конкретной проблемы заключается в реализации пользовательского NamingStrategy:

public class NamingStrategyWrapper implements NamingStrategy {
    private NamingStrategy target;

    public NamingStrategyWrapper(NamingStrategy target) {
        this.target = target;
    }

    public String columnName(String arg0) {
        if ("columnameA".equals(arg0)) return getColumnName();
        else return target.columnName(arg0);        
    }

    ...
}

-

AnnotationConfiguration cfg = new AnnotationConfiguration();
cfg.setNamingStrategy(new NamingStrategyWrapper(cfg.getNamingStrategy()));
factory = cfg.configure().buildSessionFactory();
0 голосов
/ 21 июня 2010

Единственными значениями, которые вы можете присвоить атрибутам, являются постоянные значения, заданные вручную или сохраненные в public static final переменных.

Аннотации не определяют поведение, а только метаинформацию о классе, методах инравится.Вы можете указать поведение в процессорах аннотаций, которые читают ваши аннотации и генерируют новый исходный код или другие файлы.

Написание процесса аннотации мне неизвестно, но вы можете найти другую информацию в Инструменте обработки аннотаций путеводитель по Sun.

...