所以我偶然发现了这种奇怪的情况。 有经典的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.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上运行。
任何指针都受到欢迎。
谢谢
答案 0 :(得分:0)
回答我自己的问题,这是由调用EJB远程Facade引起的。 即使我们在同一个JVM上,EJB仍在使用@Remote时使用参数隔离:
“远程业务接口方法的参数和结果按值传递。”来源JSR 318: Enterprise JavaBeans,Version 3.1第45页,3.2.1远程客户端