Список классов .contains (тот же класс) не работает [duplicate]

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

Атрибут 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 см. Предыдущий ответ .

3
задан Stephen C 13 November 2012 в 14:46
поделиться

5 ответов

Массивы 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, как и ожидалось

7
ответ дан amit 4 September 2018 в 06:43
поделиться

Это потому, что String [] transaction является объектом. А когда вы вызываете contains, список сравнивает новый объект с другим, используя метод equals. Представьте, что это как

new Object().equals(new Object())
0
ответ дан Aleksandr M 4 September 2018 в 06:43
поделиться

Посмотрите на getPendingTransaction и getSentTransactionRequests, если он должен вернуть массив SAME и не создать NEW. Во-вторых, попробуйте отлаживать и искать идентификатор объекта массивов. Если это не то же самое, но оно должно быть (и содержит одинаковые элементы), попробуйте обход этого (например, создать компаратор или список или что-то вроде этого).

1
ответ дан Anton Bessonov 4 September 2018 в 06:43
поделиться

Если вы должны использовать 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>>.

0
ответ дан MC Emperor 4 September 2018 в 06:43
поделиться

Проблема заключается в том, что equals для массивов определяется как ссылочное равенство. Другими словами, два разных массива, которые содержат одни и те же элементы, НЕ равны ... по методу equals.

Если вы хотите, чтобы equals для объектов транзакции основывался на равенство строк, вам нужно создать собственный класс для хранения String[] и переопределить метод equals и метод hashcode.


Кстати, массив equals(Object) метод не «немного сломан». Определенная семантика equals просто отражает тот факт, что любой объект массива по своей сути изменен.

1
ответ дан Stephen C 4 September 2018 в 06:43
поделиться
Другие вопросы по тегам:

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