2010-09-30 14 views
1

J'utilise Java Enterprise Edition avec JPA (Hibernate) pour une application client-serveur (via EJB). Le programme stocke beaucoup de données dans une base de données qui doit être transférée au client. Parce que je veux transférer moins de données que possible, je ne veux pas transférer des objets deux fois.Transférer des objets une seule fois via EJB/JPA (Hibernate)

Je veux montrer mon problème avec un petit exemple:

Base de données:

[User] 
- UserID (PK) 
- Name 
- Adress (FK) 

[Adress] 
- AdressID (PK) 
- Street 

Sample data: 
[User:1, Max, 1] 
[User:2, Peter, 2] 
[Adress:1, Mainstreet] 
[Adress:2, Riverstreet] 

Maintenant, je veux transférer une liste de tous les utilisateurs (avec le chargement désireux de Adresse) au client et aussi une liste de toutes les adresses.

création côté serveur des listes:

Userlist:

Query q = manager.createQuery("select u from UserBean m LEFT JOIN FETCH u.adress"); 
List<UserBean> l = (List<UserBean>) q.getResultList(); 
return l; 

Adresslist:

Query q = manager.createQuery("select a from AdressBean m"); 
List<AdressBean> l = (List<AdressBean>) q.getResultList(); 
return l; 

Lorsque le client obtient les listes que je vérifie les hashcodes de user1.getAdress().hashCode() et adress1.hashCode(). Le résultat est qu'il n'est pas égal de sorte que l'objet doit avoir été sauvegardé deux fois et être transféré deux fois lors de l'obtention des listes.

Est-il possible de dire (peut-être dans l'EJB) de transférer des objets une seule fois et de transférer les bonnes références? Ou puis-je améliorer mon mécanisme de transfert?

Merci beaucoup! Peter31280

Répondre

2

Vous ne pouvez pas transférer les mêmes instances si votre client s'exécute sur une machine virtuelle différente. La désérialisation par défaut crée de nouvelles instances des objets.

Donc, vous devriez remplacer hashCode() et equals() sur vos cours.

+0

quoi d'autre :) +1 –