ArrayIndexOutOfBoundsException при добавлении элемента в PersistentSet Hibernate - PullRequest
0 голосов
/ 28 июня 2018

Так что я наткнулся на эту странную ситуацию. Получил классические объекты JPA:

Измерение:

@OneToMany(mappedBy = "measurement", fetch = FetchType.EAGER, cascade = CascadeType.REMOVE)
public Set<ChangeLogItem> getChangeLog() {
    return changeLog;
}

ChangeLogItem:

@JoinColumn(name = "MEASUREMENT_ID", referencedColumnName = "MEASUREMENT_ID")
@ManyToOne
public Mereni getMeasurement() {
    return measurement;
}

Сущность Измерение имеет служебный метод:

public void addToChangeLog(ChangeLogItem element) {
    if (element == null) {
        throw new IllegalArgumentException("Element ChangeLogItem can't be null");
    }
    getChangeLog().add(element);
    element.setMeasurement(this);
}

Когда этот служебный метод вызывается И Набор ChangeLogItem ПУСТО, я получил:

Caused by: java.lang.ArrayIndexOutOfBoundsException: -912523107
  at java.util.HashMap.put(HashMap.java:494)
  at java.util.HashSet.add(HashSet.java:217)
  at org.hibernate.collection.PersistentSet.add(PersistentSet.java:213)

Теперь, когда я вручную добавляю какой-нибудь ChangeLogItem в базу данных, метод add () отлично работает.

Обновление: После некоторой болезненной отладки я обнаружил, что странное поведение происходит внутри java.util.HashMap. В public V put(K var1, V var2) есть код, который должен расширить базовую таблицу:

if (this.table == EMPTY_TABLE) {
    this.inflateTable(this.threshold);
}

но в моем случае inflateTable() никогда не вызывается, потому что this.table == EMPTY_TABLE всегда оценивается как false. Выражение this.table.length равно 0 и this.table.length == EMPTY_TABLE.length равно true !!! Если я правильно понимаю, тогда, если this.table.length == EMPTY_TABLE.length равно true, тогда this.table == EMPTY_TABLE должно быть также true и inflateTable() должно быть вызвано. Я получил второй проект с той же версией JDK / Hibernate / GlassFish, и там он работает просто отлично! Работает на JDK 1.7.0_80 и GlassFish 3.1.1.2.

Любые указатели приветствуются.

Спасибо

1 Ответ

0 голосов
/ 13 июля 2018

Отвечая на мой собственный вопрос, это вызвано вызовом удаленного фасада EJB. Несмотря на то, что мы находимся в той же JVM, EJB все еще использует изоляцию параметров при использовании @Remote:

«Аргументы и результаты методов удаленного бизнес-интерфейса передаются по значению». source JSR 318: Enterprise JavaBeans, версия 3.1 стр. 45, 3.2.1 Удаленные клиенты

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...