Hibernate 如何用GWT修复LazyInitializationException?
我有: 这是我的服务:Hibernate 如何用GWT修复LazyInitializationException?,hibernate,gwt,lazy-initialization,Hibernate,Gwt,Lazy Initialization,我有: 这是我的服务: org.hibernate.LazyInitializationException: could not initialize proxy - no Session 我正在尝试在gwt中使用我的服务: @Service("empService") public class EmpServiceImpl extends RemoteServiceServlet implements EmpService { @Autowired EmpHome empHo
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
我正在尝试在gwt中使用我的服务:
@Service("empService")
public class EmpServiceImpl extends RemoteServiceServlet implements EmpService {
@Autowired
EmpHome empHome;
@Override
@Transactional
public Emp findById(short id) {
return empHome.findById(id);
}
EmpServiceAsync EmpServiceAsync=GWT.create(EmpService.class);
AsyncCallback callback=新的AsyncCallback(){
@凌驾
失败时的公共无效(可丢弃){
信息显示(“故障”、“故障”和“故障”);
}
@凌驾
成功时的公共无效(Emp结果){
Info.display(“Succes”,result.getEname());
}
};
empServiceAsync.findById((短)7844,回调);
我强烈反对直接在GWT客户端中使用Hibernate映射对象Emp
。
您的Hibernate会话仅在findById
中可用,因为它标记为@Transactional
,但是GWT需要遍历整个Emp
对象,以便为客户端序列化它。这显然会发生在findById
之外,因此如果Emp
包含任何需要延迟加载的属性(例如,关联列表),您将得到LazyInitializationException
解决方案是使用中间数据传输对象,例如
EmpDTO
,并在服务事务块内将Emp
转换为EmpDTO
。我实际上通过为我的域对象创建CustomFieldSerializer解决了这个问题
请查看此文件:
我已经注释掉了相关的行,因为我最终不需要它,但下面是代码:
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);
public static void serialize(SerializationStreamWriter编写器,FeaturesMetadata实例)引发序列化异常{
writer.writeInt(instance.getId());
writer.writeString(instance.getState());
writer.writeString(instance.getstateAbr());
writer.writeString(instance.getUsgsDate());
writer.writeString(instance.getFilename());
writer.writeString(instance.getstategoid());
writer.writeString(instance.getCurrentStatus());
if(instance.getFeatureList().size()==0){
writeObject(新的ArrayList());
}否则{
writeObject(新的ArrayList(instance.getFeatureList());
}
}
最后一行接受实例对象的getFeatureList()的一个参数,它实际上是一个Hibernate PersistentBag,并用所述PersistentBag的内容写出一个实际的ArrayList 您应该提供有关
Emp
对象的更多详细信息。它与其他实体有关系吗?谢谢!我发现这本手册和推土机修复了我的错误。这篇文章没有矛盾之处。推土机只是为您生成DTO,这基本上就是我建议的。不知道你为什么不接受这个答案。
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()));
}
}