Dag allemaal,
Ik loop tegen hetvolgende probleem aan:
Ik wil in mijn database twee entiteiten opslaan die een 1:1 relatie hebben (vereniging, contactpersoon). Hiervoor heb ik een service. De service gebruikt een DAO om de database aan te spreken.
Omdat de relatie tussen vereniging en contactpersoon 1:1 is, moet het opslaan van een nieuwe vereniging (met bijbehorend contactpersoon) transactioneel gebeuren. Om dit werkend te zien maak ik gebruik van de progmatische (is dat een woord?) methode in Spring om mijn transactie te doen (mbv de TransactionTemplate).
De methode in de service:
In mijn servicetest werkt alles naar wens. Deze servicetest is gebaseerd op de AbstractTransactionalDataSourceSpringContextTests.
Als ik echter de service aanroep in mijn programma krijg ik Spring DataIntegrityViolationException (Hibernate ConstraintViolationException). Uit de verdere logs concludeer ik dat de transactie netjes gestart etc. wordt, maar waar het precies misgaat is me onduidelijk.
Heeft iemand een idee waar ik het kan zoeken?
- mijn applicationContext.xml en test-applicationContext.xml zijn identiek
Ik loop tegen hetvolgende probleem aan:
Ik wil in mijn database twee entiteiten opslaan die een 1:1 relatie hebben (vereniging, contactpersoon). Hiervoor heb ik een service. De service gebruikt een DAO om de database aan te spreken.
Omdat de relatie tussen vereniging en contactpersoon 1:1 is, moet het opslaan van een nieuwe vereniging (met bijbehorend contactpersoon) transactioneel gebeuren. Om dit werkend te zien maak ik gebruik van de progmatische (is dat een woord?) methode in Spring om mijn transactie te doen (mbv de TransactionTemplate).
De methode in de service:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| public void createVereniging(final Vereniging vereniging, final ContactPersoon contactPersoon) throws DataIntegrityViolationException { TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager); transactionTemplate.setPropagationBehavior(TransactionTemplate.PROPAGATION_REQUIRED); transactionTemplate.execute(new TransactionCallbackWithoutResult() { protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) { contactPersoon.setVereniging(vereniging); vereniging.setContactPersoon(contactPersoon); // create the new ContactPersoon genericDao.createObject(contactPersoon); // retrieve the new ContactPersoon and bind new Vereniging to it ContactPersoon newContactPersoon = (ContactPersoon) genericDao.retrieveObjectsByValueBean(contactPersoon).iterator().next(); newContactPersoon.setVereniging(vereniging); vereniging.setContactPersoon(newContactPersoon); // create the new Vereniging genericDao.createObject(vereniging); } }); } |
In mijn servicetest werkt alles naar wens. Deze servicetest is gebaseerd op de AbstractTransactionalDataSourceSpringContextTests.
Als ik echter de service aanroep in mijn programma krijg ik Spring DataIntegrityViolationException (Hibernate ConstraintViolationException). Uit de verdere logs concludeer ik dat de transactie netjes gestart etc. wordt, maar waar het precies misgaat is me onduidelijk.
Heeft iemand een idee waar ik het kan zoeken?
- mijn applicationContext.xml en test-applicationContext.xml zijn identiek