Так что я наткнулся на эту странную ситуацию.
Получил классические объекты 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.
Любые указатели приветствуются.
Спасибо