2011-09-20 74 views
0

我:如何修复LazyInitializationException与GWT?

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

您应该提供关于'Emp'对象的更多细节。它与其他实体有关系吗? – Peter

回答

1

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

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

+0

谢谢!我发现这本手册http://code.google.com/intl/ru-RU/webtoolkit/articles/using_gwt_with_hibernate.html和推土机修复我的错误 – Selector

+0

这篇文章没有什么矛盾。推土机只为您生成DTO,这实际上就是我所建议的。不知道为什么你不接受答案。 –

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,并将一个实际的ArrayList与PersistentBag的内容一起写出来。