2010-12-09 34 views
1

J'essaie d'utiliser JPA [Hibernate] lazy-chargement frontal avec GWTJPA [Hibernate] Lazy-chargement avec problème GWT

Dans entité

@ManyToOne(targetEntity = Item.class,fetch=FetchType.LAZY) 
private Item item; 

Dans dao

@Transactional 
public List<Purchase> findAllPurchases() { 
    return jpaTemplate.execute(new JpaCallback<List<Purchase>>(){ 
    public List<Purchase> doInJpa(EntityManager em) 
    throws PersistenceException { 
    List<Purchase> list = em.createQuery("select o from Purchase o").getResultList(); 
    for(Purchase p:list){ 
    Item item = p.getItem(); 
    if(item!=null) 
    item.getItemName(); 
    } 
return list; 
} 

}); }

et je reçois cette erreur.

com.google.gwt.user.client.rpc.SerializationException: Type 'com.hardwarestore.vo.Item _ $$ _ javassist_0' n'a pas été inclus dans l'ensemble des types qui peuvent être sérialisé par ce SerializationPolicy ou son L'objet de classe n'a pas pu être chargé. Pour des raisons de sécurité, ce type ne sera pas sérialisé.: Instance = [email protected]

Les deux classes Purchase et Item implémentent une interface sérialisable. Toute forme d'aide est appréciée. Je vous remercie.

+0

Le même problème est adressé [ici] (http://stackoverflow.com/questions/3397475/hibernate-serialization-exception-in-gwt-but-eclipselink-not/3398839#3398839) et [là] (http : //stackoverflow.com/questions/1778578/lazy-eager-loading-strategies-in-remoting-cases-jpa/1778625#1778625). –

Répondre

1

Il suffit de transformer l'objet persistant du côté serveur avant de l'envoyer au client.

+0

Oui, le clonage profond semble être le seul moyen pour le moment. Cette dernière chose que je veux faire. – zawhtut

+0

Mais n'est-ce pas si mauvais pour GWT de nous faire retourner aux jours de DTO? –

1

Le sérialiseur dans GWT est incapable de sérialiser l'objet proxy de votre collection, car sa classe est créée lors de l'exécution dans votre partie serveur. Pour sérialiser une désérialisation, les sources ProxyObject doivent être trouvées sur compiletime (je pense).

Pour autant que je sache le processus de sérialisation dans GWT vous ne pouvez pas effectuer de chargement paresseux. Vous devez transformer vos entités de cette façon, que vous créiez une méthode appelable, qui charge la collection à partir de JS par la clé primaire de votre Entité qui contient la collection ou vous devez basculer la collection vers le chargement avide. Vous pouvez aussi utiliser DTO (objet de transfert de données).