2010-07-19 20 views
1

J'ai un simple POJO mappé à une table en utilisant Hibernate. Ce qui fonctionne très bien.Objet de données Hibernate sérialisable pour GWT RPC

Mon problème est que je veux être en mesure de sérialiser l'objet pour que je puisse obtenir le fil pour cuvette mes appels RPC GWT. Si mon retour de service async cet objet que je reçois une erreur:

com.google.gwt.user.client.rpc.SerializationException: Type 'org.hibernate.collection.PersistentSet' was not included in the set of types which can be serialized by this SerializationPolicy or its Class object could not be loaded. For security purposes, this type will not be serialized.

Je suppose que cela est dû au fait qu'il ne peut pas sérialiser Set car il est une interface donc pas sérialisable. D'un autre côté, Hibernate a besoin d'une interface de collection (Set/Map) pour fonctionner. Donc, cela signifie que je ne peux plus envoyer d'objets mappés avec Hibernate? Y a-t-il un moyen "facile" de sérialiser un Set?

Merci.

Répondre

1

Le problème est que GWT ne trouve pas le code source des annotations et les classes utilisées. GWT a besoin de ce code source puisqu'il doit compiler votre objet dans JS.

I want to be able to serialize the object so I can get it trough the wire for my GWT-RPC calls.

Vous pouvez utiliser Gilead pour le faire. (Anciennement connu sous le nom Hibernate4GWT)

I suppose this is due to the fact it cannot serialize Set since this is an interface hence not serializable. On the other hand Hibernate needs a collection interface (Set/Map) to work. So this means I can no longer send objects mapped with Hibernate? Is there some "easy" way to serialize a Set?

Le problème est pas avec Set, GWT peut très bien sérialisation collections par son GWT-RPC. Bien que pendant la transmission, vous voulez utiliser une implémentation spécifique comme HashSet pour lui permettre d'optimiser pour cette implémentation particulière, au lieu d'une interface générique.

+0

Je vais essayer ça. Aussi trouvé cet autre lien qui est à peu près la même question. THX. http://stackoverflow.com/questions/3183269/hibernate-and-serializable-entities –

+0

Merci, même si j'ai utilisé (au moins pour l'instant) la solution Dozer. Je comprends maintenant ce problème GWT JRE Emulation Library. –

2

Juste pour ajouter des détails sur la façon dont je résolu ce problème de sérialisation:

1- J'ai 2 objets du modèle de données (ce qui est terrible, mais je ne suis pas le temps pour un projet scolaire pour nettoyer le haut).

// 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- J'utilise Dozer à la carte-modèle < persistant == au ==> Serializable classe de données patient. Comme ceci:

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

Ce patient est renvoyé par mon service asynchrone au client. Après ce mappage, vous pouvez voir que le patient a un type HashSet <> de java.util à la place de la version non sérialisable d'hibernate.