gpt4 book ai didi

java - 将元素添加到 Hibernate 的 PersistentSet 时出现 ArrayIndexOutOfBoundsException

转载 作者:太空宇宙 更新时间:2023-11-04 10:21:37 28 4
gpt4 key购买 nike

所以我偶然发现了这个奇怪的情况。获得经典的 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 集为空时,我得到:

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

欢迎任何指点。

谢谢

最佳答案

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

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

关于java - 将元素添加到 Hibernate 的 PersistentSet 时出现 ArrayIndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51082029/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com