2010-06-17 7 views
4

некоторых методов в нашей модели POJOs были аннотированными так:Изменения аннотации значения атрибута во время выполнения в Java

@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 нуль с помощью javaassist.
  • присваивателя колонка аннотация к колонку копии аннотаций объекту Переопределение старый (я не знаю, что это возможно)

Можно ли «взломать» эти методы таким образом?

Любая помощь была бы оценена ...

+1

Я ответил на аналогичный вопрос: http://stackoverflow.com/questions/906671/jpa-how-do-i-pecpec-the-table-name-corresponding-to-a-class-at-runtime/940380 # 940380 –

ответ

3

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

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

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

1

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

+0

Я не использую Ant, и мне интересно, как изменить файлы классов, а не исходный код – Lici

+0

@Lici Я просто пытался дать вам альтернативное решение. –

+0

Я знаю .... (+1) – Lici

0

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

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

+1

У вас есть пример? – Matsemann

Смежные вопросы