Toon posts:

[java] transactie faalt (spring / hibernate)

Pagina: 1
Acties:

Verwijderd

Topicstarter
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:
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

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Welke OR mapper gebruik je? Want uit de code in je 'doInTransactionWithoutResult' methode kan ik geen kaas van maken.

[edit]
Ik zie sneaky aan het einde hibernate nog staan.

[edit2]

En probeer dit eens als code.
contactPersoon.setVereniging(vereniging);
vereniging.setContactPersoon(contactPersoon);
genericDao.saveOrUpdate(contactPersoon);
genericDao.saveOrUpdate(vereniging); //deze is volgens mij al niet eens meer nodig.

[ Voor 70% gewijzigd door Alarmnummer op 06-09-2005 14:03 ]


Verwijderd

Topicstarter
Alarmnummer schreef op dinsdag 06 september 2005 @ 14:01:
Welke OR mapper gebruik je? Want uit de code in je 'doInTransactionWithoutResult' methode kan ik geen kaas van maken.

[edit]
Ik zie sneaky aan het einde hibernate nog staan.
Hi Alarmnummer,

Zie topictitel ;)

[edit]
:)

[ Voor 5% gewijzigd door Verwijderd op 06-09-2005 14:04 ]


Verwijderd

Topicstarter
Alarmnummer schreef op dinsdag 06 september 2005 @ 14:01:
En probeer dit eens als code.
contactPersoon.setVereniging(vereniging);
vereniging.setContactPersoon(contactPersoon);
genericDao.saveOrUpdate(contactPersoon);
genericDao.saveOrUpdate(vereniging); //deze is volgens mij al niet eens meer nodig.
Helaas ...
Ik heb zowel enkel je 1e 3 regels, als alle 4 de regels geprobeerd.

Wat het suffe ook is: Mijn test werkt prima:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public void testRegistreerVereniging() throws Exception {
        String achternaam = "achternaam";
        String emailadres = "email@adres.nl";
        ContactPersoon newContactPersoon = new ContactPersoon(achternaam, emailadres);

        String naam = "naam";
        Vereniging newVereniging = new Vereniging(naam, null);
        hockeyService.createVereniging(newVereniging, newContactPersoon);

        ContactPersoon contactPersoon = (ContactPersoon) hockeyService.retrieveContactPersonen(new ContactPersoon(achternaam, emailadres)).iterator().next();
        assertEquals("Expected achternaam: "+ achternaam, achternaam, contactPersoon.getAchternaam());
        assertEquals("Expected emailadres: "+ emailadres, emailadres, contactPersoon.getEmailadres());
        assertEquals("Expected naam: "+ naam, naam, contactPersoon.getVereniging().getNaam());
    }


Om de code "buiten de test" te testen (goh dat klinkt lekker...) heb ik nu de volgende code:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class RegistreerVerenigingTest {

    public static void main(String[] args) {

        HockeyService hockeyService = (HockeyService) ServiceLocator.getInstance().getBean(Constants.BEAN_HOCKEYSERVICE);

        String achternaam = "achternaam";
        String emailadres = "email@adres.nl";
        ContactPersoon newContactPersoon = new ContactPersoon(achternaam, emailadres);

        String naam = "naam";
        Vereniging newVereniging = new Vereniging(naam, null);
        hockeyService.createVereniging(newVereniging, newContactPersoon);

        ContactPersoon contactPersoon = (ContactPersoon) hockeyService.retrieveContactPersonen(new ContactPersoon(achternaam, emailadres)).iterator().next();
        Vereniging vereniging = (Vereniging) hockeyService.retrieveVerenigingenByValueBean(new Vereniging(naam)).iterator().next();
        System.out.println(contactPersoon.debug());
        System.out.println(vereniging.debug());
    }
}

Maar daar krijg ik vrolijk mijn exceptions (zoals in eerste post van thread beschreven) |:(

[ Voor 4% gewijzigd door Verwijderd op 06-09-2005 14:51 ]