Wanneer ik een save or update doe via mijn Hibernate krijg ik deze exceptie
Ik denk de exceptie te snappen na wat opzoek werk, maar ik snap de oorzaak niet.
Wat doe ik dus
Op mijn controle laag haal ik alle activiteiten uit de database.
in die lijst zoek ik een activiteit die overeenkomt met een bepaald id
ik sla deze op in een aparte variable. sla dan deze aparte variable op.
om jullie wat code voorbeelden te geven:
dit is de controller waar ik de activiteiten ophaal
dit is de Activiteiten DAO
dit is de HibernateUtil klasse
de methode waar ik de activiteit ophaal adhv het id
en uiteindelijk de code die ik aanroep om de activiteit op te slaan
de execute methode die bovenstaande aanroept
Ik denk dat ik nu alle code heb gepost.
Wat heb ik reeds geprobeerd van dingen die ik heb gelezen op diverse fora enzo:
cascade="all" uit mijn mapping files verwijderen -> probleem niet opgelost
evict(activiteit) geprobeerd op mijn sessie -> probleem niet opgelost
nieuwe sessie starten -> exception dat het object over 2 sessies gaat
Ik weet nu niet waarom die evict niet werkt want dit lijkt mij de meest logische oplossing van dit probleem.
Hopelijk kunnen jullie me helpen en moest het zijn dat ik code te weinig gepost heb, laat het me weten.
Java:
1
| org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [domein.Activiteit#1] |
Ik denk de exceptie te snappen na wat opzoek werk, maar ik snap de oorzaak niet.
Wat doe ik dus
Op mijn controle laag haal ik alle activiteiten uit de database.
in die lijst zoek ik een activiteit die overeenkomt met een bepaald id
ik sla deze op in een aparte variable. sla dan deze aparte variable op.
om jullie wat code voorbeelden te geven:
dit is de controller waar ik de activiteiten ophaal
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
| /** * Opvragen van alle activiteiten en deze stoppen in de ActiviteitLijst van de bean */ public void getActiviteiten(Persoon persoon) { try { ActiviteitenLijstOpvragenDienstController alodc = new ActiviteitenLijstOpvragenDienstController(); alodc.setPersoon(persoon); alodc.excecute(); setActiviteitLijst(alodc.getActiviteiten()); } catch (Exception ex) { Logger.getLogger(AdminActiviteitenBean.class.getName()).log(Level.SEVERE, null, ex); } } |
dit is de Activiteiten DAO
Java:
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
| public class ActiviteitDAO { // Velden // Associaties public ActiviteitDAO() throws HibernateException { HibernateUtil.beginTransaction(); } public Activiteit getActiviteitById(int id) throws HibernateException { Activiteit a = null; Session s = HibernateUtil.getSession(); a = (Activiteit) s.get(Activiteit.class, id); return a; } public void storeActiviteit(Activiteit a) throws HibernateException { Session s = HibernateUtil.getSession(); s.saveOrUpdate(a); } public void deleteActiviteit(Activiteit a) throws HibernateException { Session s = HibernateUtil.getSession(); s.delete(a); } public ArrayList<Activiteit> getAllActiviteit() throws HibernateException { Session s = HibernateUtil.getSession(); Criteria c = s.createCriteria(Activiteit.class); return (ArrayList<Activiteit>) c.list(); } /** * Deze methode vraagt de activiteiten op waarvoor de gebruiker die als parameter * meegegeven wordt mag zien * @author Jelle Victoro * @version 06/03/2008 * @param persoon * @return Arraylist met Activiteit objecten * @throws org.hibernate.HibernateException */ public ArrayList<Activiteit> getActiviteitenByUser(Persoon persoon) throws HibernateException { Session s = HibernateUtil.getSession(); List resultaat; ArrayList<Activiteit> activiteiten = new ArrayList<Activiteit>(); // Als de persoon een databeheerder is mag hij alle activiteiten zien if (persoon instanceof Databeheerder) { String hql = "from Activiteit a order by a.aanmaakDatum"; resultaat = s.createQuery(hql).list(); for (Object o : resultaat) { activiteiten.add((Activiteit) o); } } // Als de persoon een contactpersoonPolitie is, dan mag je // alle activiteiten zien waar het veld politieToezichtNodig true is else if (persoon instanceof ContactpersoonPolitie) { String hql = "from Activiteit a where a.politieToezichtNodig = true"; resultaat = s.createQuery(hql).list(); for (Object o : resultaat) { activiteiten.add((Activiteit) o); } } // Anders is de persoon een Dienst en mag hij enkel de // activiteiten zien die voor die dienst zijn bestemd, // dit gebeurd aan de hand van objecten van het type // ControleGemeentelijkeDienst else { String hql = "from ControleGemeentelijkeDienst cgd where cgd.dienst.id = :dienstId order by cgd.activiteit.aanmaakDatum"; resultaat = s.createQuery(hql).setInteger("dienstId", persoon.getId()).list(); for (Object o : resultaat) { ControleGemeentelijkeDienst cgd = (ControleGemeentelijkeDienst) o; activiteiten.add(cgd.getActiviteit()); } } return activiteiten; } } |
dit is de HibernateUtil klasse
Java:
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
| public class HibernateUtil { private static final SessionFactory sessionFactory; private static final ThreadLocal threadSession = new ThreadLocal(); private static final ThreadLocal threadTransaction = new ThreadLocal(); static { try { Configuration cfg = new Configuration(); sessionFactory = cfg.configure().buildSessionFactory(); } catch (Throwable ex) { ex.printStackTrace(System.out); throw new ExceptionInInitializerError(ex); } } public static Session getSession() throws HibernateException { Session s = (Session) threadSession.get(); // Open een nieuwe Sessie, als deze thread nog geen heeft try { if (s == null) { s = sessionFactory.openSession(); threadSession.set(s); } } catch (HibernateException ex) { throw new HibernateException(ex); } return s; } public static void closeSession() throws HibernateException { try { Session s = (Session) threadSession.get(); threadSession.set(null); if (s != null && s.isOpen()) { s.close(); } } catch (HibernateException ex) { throw new HibernateException(ex); } } public static void beginTransaction() throws HibernateException { Transaction tx = (Transaction) threadTransaction.get(); try { if (tx == null) { tx = getSession().beginTransaction(); threadTransaction.set(tx); } } catch (HibernateException ex) { throw new HibernateException(ex); } } public static void commitTransaction() throws HibernateException { Transaction tx = (Transaction) threadTransaction.get(); try { if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack()) { tx.commit(); } threadTransaction.set(null); } catch (HibernateException ex) { rollbackTransaction(); throw new HibernateException(ex); } finally { closeSession(); } } public static void rollbackTransaction() throws HibernateException { Transaction tx = (Transaction) threadTransaction.get(); try { threadTransaction.set(null); if (tx != null & !tx.wasCommitted() && !tx.wasRolledBack()) { tx.rollback(); } } catch (HibernateException ex) { throw new HibernateException(ex); } finally { closeSession(); } } } |
de methode waar ik de activiteit ophaal adhv het id
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
| /** * Ophalen van een activiteit aan de hand van een id. * @param - id * @return - Een activiteit */ public Activiteit getActiviteit(int id) { activiteit = null; for(Activiteit a : activiteitLijst) { if(a.getId() == id) activiteit = a; } return activiteit; } |
en uiteindelijk de code die ik aanroep om de activiteit op te slaan
Java:
1
2
| ActiviteitOpslaanController aoc = new ActiviteitOpslaanController(); aoc.execute(activiteit); |
de execute methode die bovenstaande aanroept
Java:
1
2
3
4
5
| public void execute(Activiteit a) throws HibernateException { ActiviteitDAO adao = new ActiviteitDAO(); adao.storeActiviteit(a); HibernateUtil.commitTransaction(); } |
Ik denk dat ik nu alle code heb gepost.
Wat heb ik reeds geprobeerd van dingen die ik heb gelezen op diverse fora enzo:
cascade="all" uit mijn mapping files verwijderen -> probleem niet opgelost
evict(activiteit) geprobeerd op mijn sessie -> probleem niet opgelost
nieuwe sessie starten -> exception dat het object over 2 sessies gaat
Ik weet nu niet waarom die evict niet werkt want dit lijkt mij de meest logische oplossing van dit probleem.
Hopelijk kunnen jullie me helpen en moest het zijn dat ik code te weinig gepost heb, laat het me weten.