2013-05-27 4 views
1

Я создаю DDL из объектов Hibernate. Некоторые из объектов используют аннотации проверки достоверности JSR 303 (javax.validation.constraints.Max - один из них).Генерировать DDL из сущностей на основе JSR 303 аннотации валидатора

DDL сгенерирован с использованием Hibernate Tools 4.0.0 CR1 + связанной задачи Ant.

Проблема заключается в том, что все текстовые столбцы (хотя они могут быть ограничены @Max (32)) генерируются как VARCHAR (255). Я попытался отладить класс org.hibernate.tool.hbm2ddl.SchemaExport (и связанный). Из того, что я видел, нет места при создании org.hibernate.cfg.Ejb3Column, который будет содержать любую логику, связанную с аннотациями Validator.

Я также попытался изменить свойство «hibernate.validator.apply_to_ddl» - без каких-либо успехов.

Любые советы были бы весьма признательны.

Компоненты/Библиотеки:

  • JDK 6
  • Hibernate Validator 4.3.0 Final
  • Hibernate Commons Аннотации 4.0.2 Final
  • Hibernate Ядро 4.2.2 Final
  • Hibernate Entity менеджер 4.2.2 Заключительный

Rafal

ответ

1

hbm2ddl не учитывает аннотации JSR 303. Такой смысл имеет смысл с точки зрения инструмента. Он генерирует «код» (DDL) для базы данных, в то время как JSR 303 aka bean-validation работает в JVM.

Для уточнения размера в базе данных необходимо установить значение length объекта JPA @Column аннотация. Да, уродливо, что вам нужно дублировать ограничение размера, но так оно и есть.

+0

Но он также игнорирует аннотации Hibernate Validator, такие как @Length. И в моей предыдущей конфигурации: Hibernate 3.3.2 + Hibernate Tools 3.4.0 он работал отлично. Есть идеи ? –

+0

'@ Length' является аннотацией, не относящейся к JPA, относящейся к Hibernate. Это простой ярлык для двух стандартных аннотаций '@ Min' /' @ Max', правильно? Я был бы удивлен, если бы 'hbm2ddl' когда-либо поддерживал это, но если вы так говорите ...Во всяком случае, единственным надежным вариантом AFAIK является '@ Column # length'. –

+0

Marcel - Да, я уверен, что это сработало - потому что мы обновили версию Hibernate (core + tools + validator), а сгенерированный DDL больше не корректно устанавливает длину текстовых столбцов. Я мог только предположить, что это связано с совершенно другой инициализацией HIbernate Validator в новых версиях Hibernate (возможно, из-за поддержки JSR 303). Метаданные Hibernate по-прежнему обновляются (основываясь на ограничениях), но это происходит с помощью класса org.hibernate.cfg.beanvalidation.TypeSafeActivator, который запускается при создании SessionFactory. В любом случае - спасибо за помощь. Ура! –

0

hbm2ddlделает рассмотрит несколько Bean Validation ограничений, а именно @NotNull, @Size, @Digits и устаревшую @Length ограничения, определенное Hibernate Validator.

Если вы не видите ограничения, отраженные в DDL, испускаемого Hibernate ORM, причины могут быть:

  • У вас нет поставщика Bean Validation (например, Hibernate Validator) на пути к классам; просто JAR API проверки подлинности недостаточно, поскольку Hibernate ORM загружает фактическую фабрику проверки, чтобы получить метаданные ограничения.
  • Вы не используете режим проверки AUTO или DDL. Только в этих режимах ограничения распространяются на DDL
Смежные вопросы