Сериализуемый объект данных Hibernate для GWT RPC - PullRequest
1 голос
/ 19 июля 2010

У меня есть простой POJO, сопоставленный с таблицей с использованием Hibernate. Который работает просто отлично.

public class Patient implements Serializable {

    private int    patientId;
    private String firstName;
    private String lastName;
    private Set<Prescription> patientPrescriptions;

    public Patient() {}

    ...
}

Моя проблема в том, что я хочу иметь возможность сериализовать объект, чтобы я мог получить его через провод для моих вызовов GWT-RPC. Если моя асинхронная служба возвращает этот объект, я получаю сообщение об ошибке:

com.google.gwt.user.client.rpc.SerializationException: тип 'org.hibernate.collection.PersistentSet' не включен в набор типов, которые могут быть сериализованы этой SerializationPolicy, или его объект Class не может быть загружен , В целях безопасности этот тип не будет сериализован.

Полагаю, это связано с тем, что он не может сериализовать Установить , так как это интерфейс, следовательно, не сериализуем. С другой стороны, для работы Hibernate необходим интерфейс коллекции (Set / Map). Значит, это значит, что я больше не могу отправлять объекты, сопоставленные с Hibernate? Есть ли какой-нибудь "простой" способ сериализации набора?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 20 июля 2010

Просто добавлю подробности о том, как я преодолел эту проблему сериализации:

1 - У меня есть 2 объекта модели данных (что ужасно, но у меня нет времени на то, чтобы школьный проект смог это исправить).

// The persistent data model class
public class PatientPersistent implements Serializable {
    ...

    Set<Prescription> patientPrescriptions;

    ...
}

// The serializable over the wire (GWT-RPC) data model class
public class Patient implements Serializable {
    ...

    Set<Prescription> patientPrescriptions;

    ...
}

2- Я использую Dozer для сопоставления персистентной модели <== с ==> классом сериализуемых данных Patient.Например:

Patient thePatient = mapper.map(persistentObject, Patient.class);

Этот пациент отправляется обратно моей службой Async клиенту.После этого сопоставления вы можете видеть, что у пациента есть тип HashSet <> из java.util вместо не сериализуемой версии hibernate.

1 голос
/ 19 июля 2010

Проблема в том, что GWT не находит исходный код аннотаций и используемых классов. GWT нужен этот исходный код, поскольку он должен скомпилировать ваш объект в JS.

Я хочу иметь возможность сериализовать объект, чтобы я мог получить его через провод для моих вызовов GWT-RPC.

Вы можете использовать Gilead , чтобы сделать это. (Ранее известный как Hibernate4GWT)

Полагаю, это связано с тем, что не может сериализовать Set, так как это Интерфейс, следовательно, не сериализуем. На другой руке Hibernate нужна интерфейс коллекции (Set / Map) для Работа. Так что это означает, что я больше не могу отправлять объекты, сопоставленные с Hibernate? Является есть какой-то "простой" способ сериализации Установить

Проблема не в Set, GWT может очень хорошо сериализовать коллекции через GWT-RPC. Хотя во время передачи вы захотите использовать конкретную реализацию, такую ​​как HashSet, чтобы позволить ее оптимизировать для этой конкретной реализации, вместо общего интерфейса.

...