Как исправить LazyInitializationException с GWT? - PullRequest
0 голосов
/ 20 сентября 2011

у меня есть:

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 ]

1 голос
/ 21 сентября 2011

Я бы настоятельно не рекомендовал использовать отображенный объект Hibernate Emp на стороне клиента GWT. Ваш сеанс Hibernate будет доступен только внутри findById, так как он помечен @Transactional, однако GWT потребуется пройти через весь объект Emp, чтобы сериализовать его для клиента. Это, очевидно, произойдет за пределами findById, поэтому вы получите LazyInitializationException, если Emp содержит какие-либо свойства, требующие отложенной загрузки (например, списки ассоциаций).

Решение состоит в том, чтобы использовать промежуточный объект передачи данных, например, EmpDTO и преобразовать Emp в EmpDTO внутри транзакционного блока службы.

0 голосов
/ 21 сентября 2011

Я действительно обошел эту проблему, создав 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...