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()));
    }
}