Какова точка установки длины столбца с помощью аннотации Hibernate? [Дубликат]

String a = new String("foo");
String b = new String("foo");
System.out.println(a == b); // prints false
System.out.println(a.equals(b)); // prints true

Убедитесь, что вы понимаете, почему. Это потому, что сравнение == сравнивает только ссылки; equals() метод сопоставляет содержимое по символу.

Когда вы вызываете new для a и b, каждый получает новую ссылку, указывающую на "foo" в таблице строк. Ссылки разные, но контент один и тот же.

51
задан Manuel Drieschmanns 7 November 2017 в 15:41
поделиться

4 ответа

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

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

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

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


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

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

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

73
ответ дан Community 15 August 2018 в 16:27
поделиться
  • 1
    Спасибо, я подозревал. У вас есть цитата, в которой говорится, что аннотация предназначена только для DDL? Я не смог найти это явно в документации. – James McMahon 20 May 2010 в 19:08
  • 2
    Я попытался использовать оба @Size(max=32) и @Column(length=128) и, к сожалению, @Size, кажется, имеет приоритет. Возможно, это ошибка Hibernate. – James Ward 31 October 2011 в 17:43
  • 3
    Например, когда я создаю столбец с длиной 1500, он генерируется как «ТЕКСТ». в MySql. Как в этом случае применяется ограничение размера? Или это вообще применяется? Благодарю. – rpr 17 September 2012 в 13:15
  • 4
    Это означает, что если я укажу @Column(length=15), можно ввести 15 или менее символов, но не более того. Я прав? – JavaTechnical 28 June 2014 в 11:59
  • 5
    но, @JavaTechnical, я считаю, что это @Column Annotation вступит в силу, если DDL, то есть Hibernate может создать / обновить / удалить вашу схему, была включена. Но я попрошу кого-нибудь подтвердить или опровергнуть здесь. – Kevin Meredith 2 September 2014 в 19:45

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

2
ответ дан cn123h 15 August 2018 в 16:27
поделиться

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

3
ответ дан lingaraju p 15 August 2018 в 16:27
поделиться

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

Это цитаты из Hibernate 4.3.11 manual

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

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

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

... Интеграция между Hibernate и Bean Validation работает на двух уровнях. Во-первых, он способен проверять экземпляры памяти в классе для нарушения ограничений. Во-вторых, он может применить ограничения к метамодели 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-Implementation. Например,

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

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

2
ответ дан Ralph 15 August 2018 в 16:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: