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"
в таблице строк. Ссылки разные, но контент один и тот же.
Выполняет ли длина какую-либо проверку или усечение, когда происходит персистентность, или она используется исключительно для создания схемы?
Атрибут
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 см. Предыдущий ответ .
Btw, если вы не задаете длину, по умолчанию будет 255 (проверено в MySQL)
@column (length = 32) предназначен только для целей DDL, а не для ограничения средств, он позволяет использовать более 32 символов, если на уровне таблицы он не ограничен. Чтобы ограничить размер, мы собираем go для @size (max = 32)
Hibernate 4.3.11 (и другие версии) должны обратить внимание на аннотации проверки. - поэтому вам, возможно, придется обновить
Это цитаты из Hibernate 4.3.11 manual
Глава 22. Дополнительные модули
Hibernate Core также предлагает интеграцию с некоторыми внешними модулями / проектами. Это включает в себя Hibernate Validator эталонную реализацию проверки бинов (JSR 303) и Hibernate Search.
... Интеграция между 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
!
@Size(max=32)
и@Column(length=128)
и, к сожалению,@Size
, кажется, имеет приоритет. Возможно, это ошибка Hibernate. – James Ward 31 October 2011 в 17:43@Column(length=15)
, можно ввести 15 или менее символов, но не более того. Я прав? – JavaTechnical 28 June 2014 в 11:59@Column
Annotation вступит в силу, еслиDDL
, то есть Hibernate может создать / обновить / удалить вашу схему, была включена. Но я попрошу кого-нибудь подтвердить или опровергнуть здесь. – Kevin Meredith 2 September 2014 в 19:45