【问题标题】:ArrayIndexOutOfBoundsException when adding element into Hibernate's PersistentSet将元素添加到 Hibernate 的 PersistentSet 时出现 ArrayIndexOutOfBoundsException
【发布时间】: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 等于0this.table.length == EMPTY_TABLE.lengthtrue !!! 如果我理解正确,那么如果this.table.length == EMPTY_TABLE.lengthtrue,那么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 不等。负索引是不可能的。
  • 这是日志中的异常:(
  • 查看ChangeLogItemhashcode addToChangeLog 方法。
  • 好吧 hashCode 是使用 Random.nextInt() 实现的,如果它有任何帮助的话。这当然可以生成负数,但这没关系。
  • 我的意思是它不能使用的单个哈希码。您使用的是哪个 java 版本?

标签: java hibernate set persistence


【解决方案1】:

回答我自己的问题,这是由调用 EJB 远程门面引起的。 即使我们在同一个 JVM EJB 在使用@Remote 时仍然使用参数隔离:

"远程业务接口的方法的参数和结果是传值的。"来源 JSR 318: Enterprise JavaBeans,Version 3.1 第 45 页,3.2.1 远程客户端

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    相关资源
    最近更新 更多