Что делает атрибут length при установке в аннотации @Column JPA? - программирование
Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

length атрибут Column для указания:

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

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


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

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

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

Ответ 2

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

Ответ 3

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

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

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

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

Глава 22.1 Bean Проверка

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

Глава 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 easy now with @Digits :) )

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


При использовании Hibernate Validator 5.1 - вам также понадобится el-Implementation. Например

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

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

Ответ 4

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