web-dev-qa-db-fra.com

Hibernate H2 spécifie l'ordre de la table de dépôt

J'ai à peu près le même problème que cet utilisateur . Hibernate ne peut pas supprimer les tables de ma base de données de test en mémoire après chaque SpringBootTest (par exemple lors de l'exécution du test mvn). Le comportement souhaité serait ddl-auto=create-drop, mais cela ne fonctionne pas.

Je pense que la raison pourrait être une commande invalide du DROP TABLE, de sorte qu'Hibernate tente de supprimer les tables dont dépendent encore d'autres tables.

Mon script data.sql contient uniquement des instructions INSERT et le schéma est automatiquement créé en fonction de mes entités. J'ai essayé d'ajouter DROP TABLE instructions en haut de data.sql et elles passent toutes (ddl-auto=create), car je peux spécifier l'ordre dans lequel ils doivent être supprimés. De l'autre côté, je dois maintenant spécifier la création de schéma dans data.sql aussi.

Existe-t-il un moyen de spécifier l'ordre des instructions de suppression sans avoir à spécifier la création du schéma? Ou est-ce que quelqu'un connaît une solution pour le problème initial ?

MODIFIER:

Je veux donner un exemple. J'ai une entité User qui a des relations avec d'autres entités (M: N, 1: N, 1: 1). Lorsque le schéma est créé, hibernate supprime toutes les tables, les crée et ajoute des contraintes:

// first test file:
Hibernate: drop table user if exists
... // drop other tables
Hibernate: create table user (username varchar(255) not null, ... , primary key (username))
... // create other tables
Hibernate: alter table X add constraint FKgi38hy0tsrdm332gdjrc0uhm3 foreign key (username) references user
Hibernate: alter table Y add constraint FK5svpy1b71l4jxni0xylrbbdtv foreign key (username) references user
Hibernate: alter table Z add constraint FK5a8fxbb0ug3eo1lisdrrxbbj foreign key (username) references user

// next test file:
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Cannot drop "USER" because "FKGI38HY0TSRDM332GDJRC0UHM3, FK5SVPY1B71L4JXNI0XYLRBBDTV, FK5A8FXBB0UG3EO1LISDRRXBBJ" depends on it; SQL statement:
drop table user if exists [90107-200]

Ce processus ne fonctionne pas après le premier fichier de test, car il enfreint les contraintes. C'est pourquoi j'ai voulu spécifier l'ordre de dépôt.

Je n'utilise pas CascadeType sur mes entités, cela pourrait-il causer le problème?

3
Melkor

Vous devez annoter vos classes de test avec DirtiesContext:

@DirtiesContext(methodMode = MethodMode.BEFORE_CLASS)

Cela reconstruira le contexte de test et, par conséquent, créera-supprimera votre schéma.

En savoir plus à ce sujet: https://www.baeldung.com/spring-dirtiescontext

0
Simon Martinelli