Изменение значения атрибута аннотации во время выполнения в Java - PullRequest
4 голосов
/ 17 июня 2010

некоторые методы в нашей модели pojos были аннотированы так:

@Column(name="cli_clipping_id", updatable=false, columnDefinition = "varchar(" + ModelUtils.ID_LENGTH + ") COLLATE utf8_bin")

columnDefinition Атрибут зависит от поставщика базы данных, поэтому при попытке отбросить схему в HSQLDB с помощью Hibernate происходит сбой:

[ERROR] 16 jun 12:58:42.480 PM main [org.hibernate.tool.hbm2ddl.SchemaExport]
Unexpected token: COLLATE in statement [create table cms.edi_editorial_obj (edi_uuid varchar(23) COLLATE] 

Чтобы исправить это, я думаю об этом решении (но не хочу тратить время, если это невозможно), во время выполнения, для каждого аннотированного столбца метода:

  • Получить аннотацию @Column
  • Создайте копию аннотации столбца, задав для columnDefinition значение null с помощью javaassist.
  • установить примечание метода столбца к объекту примечания копии столбца, переопределяющему старый (я не знаю, возможно ли это)

Можно ли так "взломать" эти методы?

Любая помощь будет высоко ценится ...

Ответы [ 3 ]

3 голосов
/ 17 июня 2010

Я не думаю, что предложенный вами метод возможен, потому что:

  1. Значение аннотации, которое вы get во время выполнения, на самом деле является прокси-классом, реализующим интерфейс аннотации. Вы не можете установить новые значения для его атрибутов.
  2. Невозможно установить новые значения аннотаций для классов или методов во время выполнения.

Однако вы можете перейти к конфигурации на основе XML для Hibernate, где вы можете изменить параметр вне кода.

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

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

0 голосов
/ 13 июня 2013

Хотя на самом деле это старая ветка. Ответ 2 выше неверен для пункта 2: на самом деле аннотации классов могут быть изменены во время выполнения.

Мне все еще интересно, как это сделать для методов.

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