Выполняет ли длина какую-либо проверку или усечение, когда происходит персистентность, или она используется исключительно для создания схемы?
Атрибут
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 см. Предыдущий ответ .
Массивы hashCode()
и equals()
немного сломаны, когда дело доходит до этого (это длинное другое обсуждение, почему).
Возможная работа заключается в том, чтобы использовать ArrayList<ArrayList<String>>
вместо из ArrayList<String[]>
, метод equals()
для ArrayList
будет таким, как вы ожидаете.
Например:
ArrayList<String> l1 = new ArrayList<>();
ArrayList<String> l2 = new ArrayList<>();
l1.add("asdf");
l2.add("asdf");
ArrayList<ArrayList<String>> coll = new ArrayList<>();
coll.add(l1);
System.out.println(coll.contains(l2));
Выдает true
, как и ожидалось
Это потому, что String [] transaction
является объектом. А когда вы вызываете contains
, список сравнивает новый объект с другим, используя метод equals
. Представьте, что это как
new Object().equals(new Object())
Посмотрите на getPendingTransaction и getSentTransactionRequests, если он должен вернуть массив SAME и не создать NEW. Во-вторых, попробуйте отлаживать и искать идентификатор объекта массивов. Если это не то же самое, но оно должно быть (и содержит одинаковые элементы), попробуйте обход этого (например, создать компаратор или список или что-то вроде этого).
Если вы должны использовать List<String[]>
, возможно, вам не повезло с использованием equals()
или hashCode()
, это кажется ......
Может быть, вам лучше создать способ сделать сравните ваши объекты
Что-то вроде
public static boolean stringArrayListEquals(List<String[]> list, List<String[]> list2) {
if (list.size() != list2.size()) return false;
for (int i = 0; i < list.size(); ++i){
if (!Arrays.equals(list.get(i), list2.get(i)) return false;
}
return true;
}
Чтобы проверить contains()
, вам понадобится другой цикл ...
Хотя вы должны серьезно использовать List<List<String>>
.
Проблема заключается в том, что equals
для массивов определяется как ссылочное равенство. Другими словами, два разных массива, которые содержат одни и те же элементы, НЕ равны ... по методу equals
.
Если вы хотите, чтобы equals
для объектов транзакции основывался на равенство строк, вам нужно создать собственный класс для хранения String[]
и переопределить метод equals
и метод hashcode
.
Кстати, массив equals(Object)
метод не «немного сломан». Определенная семантика equals
просто отражает тот факт, что любой объект массива по своей сути изменен.