0

我有:

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

2 回答 2

1

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

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

于 2011-09-20T20:54:33.303 回答
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。

于 2011-09-21T17:43:25.690 回答