Что делает атрибут длины, если он установлен в аннотации @Column JPA? - PullRequest
57 голосов
/ 20 мая 2010

Что именно делает установка длины столбца в JPA?

@Column(name = "middle_name", nullable = false, length = 32)
public String getMiddleName() {
    return this.middleName;
}

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

Я также понимаю, что JPA может находиться поверх различных реализаций, реализация, которой я занимаюсь в этом случае, - это Hibernate.

Ответы [ 4 ]

79 голосов
/ 20 мая 2010

Делает ли length какие-либо проверки или усечения, когда возникает постоянство, или она используется исключительно для создания схемы?

Атрибут length атрибута Column аннотация используется для указания:

Длина столбца.(Применяется, только если используется строковый столбец.)

И используется только в сгенерированном DDL.В вашем примере результирующий столбец будет сгенерирован как VARCHAR(32), а попытка вставить более длинную строку приведет к ошибке SQL.


Для проверки можно добавить @Size(max=32) ограничение из API Bean Validation ( JSR 303 ).Я предоставил образец с работоспособным тестом здесь .

Предоставление Size и length может показаться избыточным, но согласно Приложению D. БинаСпецификация проверки, генерирующая DDL с поддержкой проверки компонентов, не является обязательной для поставщиков сохраняемости.Поэтому используйте length для DDL, @Size для проверки.

Если вам интересно, просто поместите реализацию Bean Validation в classpath с JPA 2.0.С JPA 1.0, обратитесь к этому предыдущему ответу .

5 голосов
/ 07 марта 2015

Кстати, если вы не установите длину, она будет по умолчанию 255 (протестировано с MySQL)

3 голосов
/ 15 октября 2015

Hibernate 4.3.11 (и другие версии) следует обратить внимание на аннотации проверки. - так что, возможно, вам придется обновить

Это ссылки из Руководство по Hibernate 4.3.11

Глава 22. Дополнительные модули

Hibernate Core также предлагает интеграцию с некоторыми внешними Модули / проекты. Это включает в себя Hibernate Validator ссылку реализация проверки бина (JSR 303) и поиска в спящем режиме.

Глава 22.1 Проверка бинов

... Интеграция между Hibernate и Bean Validation работает на двух уровни. Во-первых, он может проверять экземпляры класса в памяти для нарушение ограничений. Во-вторых, он может применить ограничения к Метамодель Hibernate и включение их в сгенерированную базу данных схемы. ...

Глава 22.1.4 Схема базы данных

Hibernate использует ограничения Bean Validation для создания точной схемы базы данных:

@NotNull leads to a not null column (unless it conflicts with components or table inheritance)

@Size.max leads to a varchar(max) definition for Strings

@Min, @Max lead to column checks (like value <= max)

@Digits leads to the definition of precision and scale (ever wondered which is which? It's easy now with @Digits :) )

Примечание: @Lengh тоже работает, как @ Size


Когда вы используете Hibernate Validator 5.1 - тогда вам также потребуется el-Реализация. Например

<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>el-impl</artifactId>
    <version>2.2</version>
</dependency>

Если у вас его нет, то Hibernate ORM не сможет запустить проверку гибернации, поэтому он не будет учитывать (все) JSR-303, например @Length, @Size!

3 голосов
/ 12 сентября 2014

@ столбец (длина = 32) предназначен только для целей DDL и не для ограничения означает, что он допускает более 32 символов, если только на уровне таблицы он не ограничен. Для ограничения размера мы должны перейти к @Size (макс = 32)

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