【发布时间】:2018-06-28 11:40:58
【问题描述】:
所以我偶然发现了这种奇怪的情况。 获得经典的 JPA 实体:
测量:
@OneToMany(mappedBy = "measurement", fetch = FetchType.EAGER, cascade = CascadeType.REMOVE)
public Set<ChangeLogItem> getChangeLog() {
return changeLog;
}
变更日志项:
@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 的集合是 EMPTY 时,我得到了:
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 上运行。
任何指针都非常受欢迎。
谢谢
【问题讨论】:
-
java.lang.ArrayIndexOutOfBoundsException: -912523107 ... 数组的有效索引从 0 到 arrayLength-1 不等。负索引是不可能的。
-
这是日志中的异常:(
-
查看
ChangeLogItem的hashcodeaddToChangeLog方法。 -
好吧
hashCode是使用Random.nextInt()实现的,如果它有任何帮助的话。这当然可以生成负数,但这没关系。 -
我的意思是它不能使用的单个哈希码。您使用的是哪个 java 版本?
标签: java hibernate set persistence