7.2.9的代码如下:
public void load() {
if (container == null)
throw new IllegalStateException("container is null");
E entity;
LoadContext<E> loadContext = createLoadContext();
if (delegate == null) {
if (!needLoad())
return;
if (!sendPreLoadEvent(loadContext)) {
return;
}
entity = getDataManager().load(loadContext);
if (entity == null) {
throw new EntityAccessException(container.getEntityMetaClass(), entityId);
}
} else {
if (!sendPreLoadEvent(loadContext)) {
return;
}
entity = delegate.apply(createLoadContext());
}
if (dataContext != null) {
entity = dataContext.merge(entity, new MergeOptions().setFresh(true));
}
container.setItem(entity);
sendPostLoadEvent(entity);
}
当没有实现delegate的时候,也就是delegate 为null的时候,有一个判断if (!needLoad())来退出,而当开发人员实现自己的 delegate的时候没有办法return,如果在delegate返回一个null的时候,进入下面的代码则会异常:
if (dataContext != null) {
entity = dataContext.merge(entity, new MergeOptions().setFresh(true));
}
这个地方更加合理的写法应该是
if (dataContext != null && entity!=null) {
entity = dataContext.merge(entity, new MergeOptions().setFresh(true));
}
这样才避免了自定义的delegate返回null时候的异常。
我在实现一个非持久化的实体的自定义delegate的时候,由于第一次加载的时候是没有数据的,只能返回null,这个时候就异常了。