将元素添加到Hibernate的PersistentSet中时,ArrayIndexOutOfBoundsException

时间:2018-06-28 11:40:58

标签: java hibernate set persistence

所以我偶然发现了这种奇怪的情况。 有经典的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;
}

实体 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.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上运行。

任何指针都受到欢迎。

谢谢

1 个答案:

答案 0 :(得分:0)

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

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