Что делает атрибут length при установке на @ Column JPA annontation?


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

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

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

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

4 54

4 ответа:

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

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

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

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


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

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

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

@столбец(длина=32) предназначен только для целей DDL, а не для ограничения средств он позволяет более 32 символов, если на уровне таблицы это не так restricted.To ограничьте размер мы shold идем для @size (max=32)

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

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

это цитаты из Hibernate 4.3.11 руководство

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

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

Глава 22.1 Проверка Бобов

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

Глава 22.1.4 База Данных схема

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

@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 не сможет запустить проверку Hibernate, поэтому ad это не займет (все) JSR-303 например @Length,@Size в счет!