Bonjour,
Cela fait maintenant 2 jours que je commence à m'arracher les cheveux je viens donc solliciter votre aide. Je souhaiterai avoir quelques précisions sur les transactions d'hibernate (session.getTransaction()) avec JSF.
Actuellement je suis confronté a deux problèmes et je ne vois pas trop comment les gérer.
Le premier problème :
Code associé (Bean):
Classe Serie :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 public List getAllSeries() { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); Query q = session.createQuery ("from Serie as serie where serie.title LIKE '%" + this.search + "%'"); List<Serie> tmp = (List<Serie>) q.list(); session.getTransaction().commit(); return tmp; }
Code JSF :
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94 package Database; import java.util.Date; import java.util.Set; /** * Serie generated by hbm2java */ public class Serie implements java.io.Serializable { private Integer serieId; private ChannelSerie channelSerie; private StatusSerie statusSerie; private String title; private String description; private int format; private Date year; public Serie() { } public Serie(ChannelSerie channelSerie, StatusSerie statusSerie, int format, Date year) { this.channelSerie = channelSerie; this.statusSerie = statusSerie; this.format = format; this.year = year; } @Override public boolean equals(Object obj) { if (obj instanceof Serie) return this.hashCode() == obj.hashCode(); return false; } @Override public int hashCode() { int hash = 7; hash = 59 * hash + (this.serieId != null ? this.serieId.hashCode() : 0); return hash; } total = 0; public Integer getSerieId() { return this.serieId; } public void setSerieId(Integer serieId) { this.serieId = serieId; } public ChannelSerie getChannelSerie() { return this.channelSerie; } public void setChannelSerie(ChannelSerie channelSerie) { this.channelSerie = channelSerie; } public StatusSerie getStatusSerie() { return this.statusSerie; } public void setStatusSerie(StatusSerie statusSerie) { this.statusSerie = statusSerie; } public String getTitle() { return this.title; } public void setTitle(String title) { this.title = title; } public String getDescription() { return this.description; } public void setDescription(String description) { this.description = description; } public int getFormat() { return this.format; } public void setFormat(int format) { this.format = format; } public Date getYear() { return this.year; } public void setYear(Date year) { this.year = year; } }
Erreure :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 <x:dataTable id="results" value="#{searchBO.allSeries}" var="serie"> .... <h:outputText value="#{serie.channelSerie.title}"/> </x:dataTable>
Probleme :
Code : Sélectionner tout - Visualiser dans une fenêtre à part org.hibernate.LazyInitializationException: could not initialize proxy - no Session
Lorsque je veux accéder à une donnée d'un des fils de ma classe Serie dans un datable, hibernate lache une exception à cause du "lazy initialisation" vu que j'ai ferme la transaction. Si je ne ferme pas la transaction cela ne pose aucun probleme.
Cependant le fait de ne pas fermer une transaction n'est pas vraiment propre et me pose le probleme suivant.
Le deuxieme probleme :
Je fais une requete pour recupere un utilisateur.
Seulement je ne peux pas fermer la transaction sinon je ne peux plus modifier le client.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); Query q = session.createQuery("from Client as client where client.pseudo LIKE '" + client.getPseudo() + "' AND client.password LIKE '" + client.getPassword() + "'"); Client tmp = (Client) q.uniqueResult();
Sauf que lorsque que je souhaite sauvegarde des changements effectuer sur mon client cela pose un autre probleme.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 public String cancelSerie() { Object tmp = this.getTableSeries().getRowData(); this.client.getClientSeries().remove(new ClientSerie(this.client, ((ClientSerie)tmp).getSerie())); Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); session.saveOrUpdate(this.client); session.getTransaction().commit(); return "persoGestion"; }En effet j'essaye d'acceder aux données de l'utilisateur via deux transactions ce qui pose un probleme, cependant je ne vois pas comment régler ces problèmes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions
Si quelqu'un pouvait m'aider à trouver une solution je lui serai tres reconnaissant.
Merci d'avance pour votre aide.
Partager