我有:
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
这是我的服务:
@Service("empService")
public class EmpServiceImpl extends RemoteServiceServlet implements EmpService {
@Autowired
EmpHome empHome;
@Override
@Transactional
public Emp findById(short id) {
return empHome.findById(id);
}
我试图在gwt中使用我的服务:
EmpServiceAsync empServiceAsync = GWT.create(EmpService.class);
AsyncCallback<Emp> callback = new AsyncCallback<Emp>() {
@Override
public void onFailure(Throwable caught) {
Info.display("Failure", "что-то пошло не так");
}
@Override
public void onSuccess(Emp result) {
Info.display("Succes", result.getEname());
}
};
empServiceAsync.findById((short) 7844, callback);
答案 0 :(得分:1)
我强烈反对直接在GWT客户端使用Hibernate映射对象Emp
。
您的Hibernate会话仅在findById
内可用,因为它标记为@Transactional
,但是,GWT将需要遍历整个Emp
对象以将其序列化为客户端。这显然会发生在findById
之外,因此如果LazyInitializationException
包含任何需要延迟加载的属性(例如,关联列表),您将获得Emp
。
解决方案是使用中间数据传输对象,例如EmpDTO
并将Emp
转换为服务事务块内的EmpDTO
。
答案 1 :(得分:0)
我实际上是通过为我的域对象创建一个CustomFieldSerializer来解决这个问题。
我已经注释掉相关的行,因为我最终不需要它,但这是代码:
public static void serialize(SerializationStreamWriter writer, FeaturesMetadata instance) throws SerializationException {
writer.writeInt(instance.getId());
writer.writeString(instance.getState());
writer.writeString(instance.getStateAbbr());
writer.writeString(instance.getUsgsDate());
writer.writeString(instance.getFilename());
writer.writeString(instance.getStateGeoId());
writer.writeString(instance.getCurrentStatus());
if (instance.getFeatureList().size() == 0) {
writer.writeObject(new ArrayList<Feature>());
} else {
writer.writeObject(new ArrayList<Feature>(instance.getFeatureList()));
}
}
最后一行接受实例对象的getFeatureList()的参数,它实际上是一个Hibernate PersistentBag,并写出一个带有所述PersistentBag内容的实际ArrayList。