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.
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.
En deze schoont de boel steeds op:
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?
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