Bonjour a tous,
Je developpe une application web J2EE avec Struts et Hibernate.
Je rencontre un probleme pour passer des POJO d'une classe a l'autre.
J'ai une classe Action struts (GetUserListAction) chargée de recuperer une collection d'objets utilisateurs (POJOUser) dans la DB avec hibernate.
Cette collection est ensuite stockée dans un hashset que je passe a une clsee metier chargée de generer du XML (UserListXML) a partir de ce que contient ce hashet.
Seulement voila, lorsque je veut lire le hashet dans la classe metier j'obtiens un LazyInitializationException de la part de Hibernate. En parcourant les différents sujets de ce forum et la documentation j'ai compris qu'il sagissait d'un probleme de session hibernate et que plusieures options se présentaient a moi :
1)- mettre lazy = "false" dans le mapping hibernate pour mon POJOUser (j'ai fait le test et ca fonctionne tres bien)
2)- faire l'appel a hibernate dans la classe UserListXML auquel cas plus probleme de session fermée
3)- d'autre options que je n'ai pas tres bien compris comme "réattacher ton objet à une session et travailler avec ton objet attaché"
J'écarte dores et déja les 2 premieres options car la solution 1) va me poser des problèmes de performance a moyen terme (montée en charge de l'application) et solution 2) car j'aimerai que cette classe de génération XML reste aussi independante que possible pour pouvoir la réutiliser dans d'autres cas de figure.
Donc j'aimerai pouvoir faire cet recuperation d'objets avec Hibernate dans mon Action struts et la passer a la classe UserListXML.
Si qqn pouvait m'expliquer quleques aproches mentionnées dans l'option 3) je lui en serait tres reconaissant !
voici un peu de source pour vous faire une idée
GetUserListAction
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception, //the exceptions generated by the other classes used here such as tokenclient IOException, ServletException { HttpSession session = request.getSession(); GetUserListForm f = (GetUserListForm) form; String searchString = f.getSearchString(); String searchType = f.getSearchType(); Set userList = new HashSet(); //if mode is login if (searchType.equals("login")){ POJOUser user = new POJOUser(); Session hibSession; Transaction tx; hibSession = HibernateUtil.currentSession(); tx = hibSession.beginTransaction(); Query query = hibSession.createQuery("from POJOUser u where u.login = '" + searchString + "'"); for (Iterator it = query.iterate(); it.hasNext();) { userList.add((POJOUser) it.next()); } --------> NORMALEMENT A CET ENDROIT MON HASHET DEVRAIT ETRE REMPLI (C'est le cas avec lazy = false) <--------- tx.commit(); HibernateUtil.closeSession(); } // cook the xml UserListXML uxml = new UserListXML(userList); StringBuffer strXML; strXML = uxml.cookXML(); ...
UserListXML
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 public class UserListXML { Set userList; // constructor public UserListXML(Set userList){ this.userList = userList; } public StringBuffer cookXML(){ StringBuffer strXML = new StringBuffer(); // build header strXML.append("<?xml version=\"1.0\" ?>"); strXML.append("<userslist>"); strXML.append("<users q='"+Integer.toString(userList.size())+"'>"); -----> CA PLANTE PAR ICI <------- Iterator iter = userList.iterator(); while(iter.hasNext()){ strXML.append("<user>"); POJOUser user = (POJOUser) iter.next(); strXML.append("<login>"); strXML.append(user.getLogin().toString()); strXML.append("</login>"); strXML.append("<firstname>"); strXML.append(user.getFirstName().toString()); strXML.append("</firstname>"); strXML.append("<lastname>"); strXML.append(user.getLastName().toString()); strXML.append("</lastname>"); strXML.append("<custid>"); strXML.append("todo"); strXML.append("</custid>"); strXML.append("<contractid>"); strXML.append(user.getContractId().toString()); strXML.append("</contractid>"); strXML.append("<accttype>"); strXML.append("todo"); strXML.append("</accttype>"); strXML.append("<status>"); //activationstatus in DB strXML.append(user.getActivationStatus().toString()); strXML.append("</status>"); strXML.append("</user>"); } strXML.append("</users>"); strXML.append("</userslist>"); //spit the thing return strXML; }
voila j'espere que ca suffira pour saisr le probleme.
Merci de votre aide !
A+
Partager