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

EmpGWTクライアント側でHibernateマップオブジェクトを直接使用することは強くお勧めしません。Hibernateセッションは、findByIdマークされているため内部でのみ使用できますが、GWTはオブジェクト@Transactional全体をトラバースして、クライアント用にシリアル化する必要があります。Empこれは明らかに外部で発生するため、遅延読み込みを必要とするプロパティ(たとえば、関連付けリスト)が含まれている場合findByIdに取得されます。LazyInitializationExceptionEmp

解決策は、たとえば中間データ転送オブジェクトを使用して、サービストランザクションブロック内にEmpDTO変換するEmpことです。EmpDTO

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

最後の行は、実際にはHibernate PersistentBagであるインスタンスオブジェクトのgetFeatureList()の引数を取り、そのPersistentBagの内容を含む実際のArrayListを書き出します。

于 2011-09-21T17:43:25.690 に答える