com.sun.jdi.InvocationException occurred invoking method.

前几天遇到一个问题,错误信息如下:


习惯性的上网搜了一下解决方法,之后发现大多数帖子、博客都说是Hibernate懒加载造成的问题,更搞笑的是解决方案竟然是将lazy="false"。。。

对于这种治标不治本的解决方法,我无力吐槽,只能一笑而过了。。。

之后回头好好看了看错误信息,发现Bug其实已经很明显了,就是ID为[4028810749dfa59c0149dfaf16810004]的OrgInfo对象不存在呗。。。

于是debug调试了下,发现是在此处OrgInfoModify获取OrgInfo对象时导致的问题,此时OrgInfo对象的值为com.sun.jdi.InvocationException occurred invoking method.

for (OrgInfoModify orgInfoModify : modifyList) {
	OrgInfo orgInfo = orgInfoModify.getOrgInfo();
	if (orgInfo != null) {
		if(!groupOrgId.equals(orgInfo.getObjId())) {
			resList.add(orgInfoModify);
		}
	}
}

忘了说,由于是二次开发的项目,所以对源代码不是很熟悉,只能针对问题去看某一模块的代码片段。。。

于是翻开OrgInfoModify的源码,发现OrgInfoModify与OrgInfo是多对一的关系

/** 机构 */
@ManyToOne(fetch=FetchType.LAZY, optional=true)
@JoinColumn(name="ORG_INFO_ID") // 关联的外键
@BatchSize(size = 15) // 批量抓取
private OrgInfo orgInfo;

于是根据错误提示信息,在OrgInfo表中查找ID为[4028810749dfa59c0149dfaf16810004]的记录,记录不存在,所以懒加载的时候导致对象无法成功加载。

这个时候出错的原因已经很明显了,接下来就是解决数据缺失的问题了,而非像网上大多数说的将lazy属性设置为false。

你可能感兴趣的:(java,Hibernate)