如何使用GWT修复LazyInitializationException?

时间:2011-09-20 10:45:28

标签: hibernate gwt lazy-initialization

我有:

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

2 个答案:

答案 0 :(得分:1)

我强烈反对直接在GWT客户端使用Hibernate映射对象Emp。 您的Hibernate会话仅在findById内可用,因为它标记为@Transactional,但是,GWT将需要遍历整个Emp对象以将其序列化为客户端。这显然会发生在findById之外,因此如果LazyInitializationException包含任何需要延迟加载的属性(例如,关联列表),您将获得Emp

解决方案是使用中间数据传输对象,例如EmpDTO并将Emp转换为服务事务块内的EmpDTO

答案 1 :(得分:0)

我实际上是通过为我的域对象创建一个CustomFieldSerializer来解决这个问题。

看一下这个文件:https://github.com/dartmanx/mapmaker/blob/0.5.2/src/main/java/org/jason/mapmaker/shared/model/FeaturesMetadata_CustomFieldSerializer.java

我已经注释掉相关的行,因为我最终不需要它,但这是代码:

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。