[DBUnit/HSQL] Integrity constraint violation

Pagina: 1
Acties:

  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Topicstarter
Voor mijn huidige project maken we gebruik van Hibernate. Tevens gebruiken we DBUnit om DB/JUnit tests te schrijven tegen een HSQL database. Dit vergemakkelijkt het testen namelijk.

Alleen we hebben een probleem met DBUnit en een zelf-referentie in een Hibernate mapping-file. In onze Hibernate-mapping file hebben we een Stap-object gedefinieerd, die een referentie heeft naar de volgende stap. Deze volgende stap is een verwijzing naar een ander record in dezelfde tabel.

XML:
1
2
3
4
5
6
<class name="nl.dummy.Stap" table="STAP">
 (...............)

<many-to-one name="volgende" class="nl.dummy.Stap" column="VOLGENDESTAP" fetch="join" foreign-key="FK_stap_stap">

</many-to-one>


Wanneer ik nu in DBUnit een dataset (in xml) maak met twee Stap records, waarvan de tweede naar de eerste wijst, krijg ik problemen.

Stukje code uit onze generieke DBUnit superklasse: Deze methode wordt aangeroepen voor elke testcase.
Java:
1
2
3
4
5
6
7
8
9
10
11
12
    protected void onSetUpBeforeTransaction() throws Exception {
        super.onSetUpBeforeTransaction();

        connection = new DatabaseDataSourceConnection(dataSource);

        set = getDataSet(); // Haal data uit XML dataset
        try {
            DatabaseOperation.CLEAN_INSERT.execute(connection, set);
        } finally {
            connection.close();
        }
    }


En deze schoont de boel steeds op:
Java:
1
2
3
4
5
6
7
    protected void onTearDownAfterTransaction() throws Exception {
        try {
            DatabaseOperation.DELETE_ALL.execute(connection, set);
        } finally {
            connection.close();
        }
    }


Bij het aanroepen van de DELETE_ALL gooit deze een SQLException:
(java.sql.SQLException: Integrity constraint violation FK_stap_stap table: STAP).

Het lijkt erop dat de records in de verkeerde volgorde worden verwijderd, maar bij een DELETE_ALL zou in één keer de hele tabel leeggemikt moeten worden, dus dat zou het probleem niet moeten zijn.

Iemand een idee hoe we dit kunnen oplossen?

Fat Pizza's pizza, they are big and they are cheezy


  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Topicstarter
Klein kickje :) Heeft iemand hier sowieso ervaring met DBUnit? Of HSQL? Iedere hint komt van pas. :)

Fat Pizza's pizza, they are big and they are cheezy


  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Niet direct een oplossing voor je probleem; maar je zou wel eens kunnen kijken naar het opensource project, die integratie testen vergemakkelijkt en nog een set aan utility stuff aanbiedt. Zo is het onder andere mogelijk om je constraints voor bepaalde operaties uit te schakelen. Ik weet wel niet of HSQL db gesupporteerd is. Ook is het hiermee mogelijk om je Hibernate mappings op een simpele manier te testen.

Maar om even op je probleem terug te komen; je dient wel rekening te houden met een bepaalde volgorde in je dataset. Diegenen die eerst toegevoegd worden aan je tabel, worden bij een DELETE_ALL als laatste weer verwijderd (of zou toch moeten).

[ Voor 3% gewijzigd door -FoX- op 07-12-2006 15:29 ]


  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Topicstarter
-FoX- schreef op donderdag 07 december 2006 @ 11:06:
Maar om even op je probleem terug te komen; je dient wel rekening te houden met een bepaalde volgorde in je dataset. Diegenen die eerst toegevoegd worden aan je tabel, worden bij een DELETE_ALL als laatste weer verwijderd (of zou toch moeten).
Hmm, volgens de sourcecode van DBUnit wordt wel een DELETE FROM TABLE gedaan, dus 1 SQL operatie. Dan maakt de volgorde toch niet meer uit? Of is dat DB specifiek?

Ps. Ik zie op die site een link naar een bedrijf dat ik ken. :P Werk jij daar toevallig? (hint hint) :)

Fat Pizza's pizza, they are big and they are cheezy


  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

JKVA schreef op donderdag 07 december 2006 @ 12:38:
Hmm, volgens de sourcecode van DBUnit wordt wel een DELETE FROM TABLE gedaan, dus 1 SQL operatie. Dan maakt de volgorde toch niet meer uit? Of is dat DB specifiek?
Kan zijn, ben niet zo heel bekend met DBUnit. Als ze het toch op die manier doen, hadden ze evengoed voor een TRUNCATE TABLE kunnen gaan, want dat is uiteindelijk toch nog sneller.
Ps. Ik zie op die site een link naar een bedrijf dat ik ken. :P Werk jij daar toevallig? (hint hint) :)
Ja, die link is er omdat dit project vanuit de developers van dat bedrijf gemaakt zijn. Maar het is gewoon een vrij frameworkje hoor; Laten we zeggen dat ik iemand ken die eraan meegewerkt heeft.

  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Topicstarter
Hmm, is die tool al een beetje volwassen? Ik kan tenminste geen downloadlink vinden... Of is het nog een beta?

Fat Pizza's pizza, they are big and they are cheezy


  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

JKVA schreef op donderdag 07 december 2006 @ 13:46:
Hmm, is die tool al een beetje volwassen? Ik kan tenminste geen downloadlink vinden... Of is het nog een beta?
Blijkbaar is de downloadlink weer verwijderd.. denk dat deze toch nog niet zo matuur zal zijn afterall..
je kan wel natuurlijk altijd zelf builden :)

  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Topicstarter
Ik wacht wel ff op een stabiele release. Voorlopig moeten we toch met DBUnit doorgaan gezien de hoeveelheid tests die we al gefixed hebben.

Ze staan trouwens dit jaar op de JavaPolis, misschien maar eens gaan kijken.

Fat Pizza's pizza, they are big and they are cheezy

Pagina: 1