org.dbunit.jeu de données.NoSuchTableException: Ne pas trouver de table 'xxx' schéma 'null'
Je sais qu'il y a eu des discussions wrt pour dbunit ici. J'ai lu la plupart d'entre eux, mais je ne peux pas l'air de trouver une solution à mon problème.
J'ai mis en place hibernate et spring. Je suis en train de faire TDD donc j'ai eu au fil d'un véritable DAO cadre de tests avant d'écrire le code. Dbunit est venu à l'esprit et je suis arrivé à la configuration des. Voici ma testdataset.xml
<?xml version='1.0' encoding='UTF-8'?>
<dataset>
<table name="status">
<column>statusId</column>
<column>status</column>
<row>
<value>0</value>
<value>Available</value>
</row>
</table>
<table name="user">
<column>userId</column>
<column>firstName</column>
<column>lastName</column>
<column>username</column>
<column>password</column>
<column>email</column>
<row>
<value>0</value>
<value>system</value>
<value>admin</value>
<value>admin</value>
<value>admin</value>
<value>admin@ccbs.com</value>
</row>
</table>
<table name="reservation">
<column>reservationId</column>
<column>userId</column>
<column>reservationDate</column>
<column>startDate</column>
<column>endDate</column>
<column>statusId</column>
<row>
<value>0</value>
<value>0</value>
<value>2011-02-20 12:46:00.0</value>
<value>2011-03-01 12:00:00.0</value>
<value>2011-04-01 12:00:00.0</value>
<value>0</value>
</row>
</table>
</dataset>
Tout semble bien jusqu'à ce que j'essaie d'associer un code en utilisant une classe de base qui charge le jeu de données. Voici mon code:
@Transactional
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:test-applicationContext.xml" })
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
public class BaseContextSensitiveTest {
@BeforeClass
public static void setUpDatabase() throws Exception {
URL file = getInitalDatasetURL();
testDataset = createDataset(file);
}
@Before
public void init() throws Exception {
log.info("Initializing Data Set");
connection = createDBUnitConnection();
DatabaseOperation.CLEAN_INSERT.execute(connection, testDataset);
}
private static URL getInitalDatasetURL() throws FileNotFoundException {
URL file = ClassLoader.getSystemResource(TEST_DATASET_LOCATION);
if (file == null) {
throw new FileNotFoundException("Unable to find '"
+ TEST_DATASET_LOCATION + "' in the classpath");
}
return file;
}
private static IDataSet createDataset(URL file) throws IOException,
DataSetException {
return new XmlDataSet(file.openStream());
}
private IDatabaseConnection createDBUnitConnection()
throws DatabaseUnitException, SQLException {
Connection connection = getConnection();
IDatabaseConnection dbUnitConn = new DatabaseConnection(connection);
//use the hsql datatypefactory so that boolean properties work
//correctly
DatabaseConfig config = dbUnitConn.getConfig();
config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY,
new HsqldbDataTypeFactory());
return dbUnitConn;
}
Dès qu'elle touche le DatabaseOperation.CLEAN_INSERT.execute(connection, testDataset);
il jette l'exception suivante:
org.dbunit.dataset.NoSuchTableException: Did not find table 'USER' in schema 'null'
at org.dbunit.database.DatabaseTableMetaData.<init>(DatabaseTableMetaData.java:142)
at org.dbunit.database.DatabaseDataSet.getTableMetaData(DatabaseDataSet.java:290)
at org.dbunit.operation.DeleteAllOperation.execute(DeleteAllOperation.java:109)
at org.dbunit.operation.CompositeOperation.execute(CompositeOperation.java:79)
at com.cottage.test.BaseContextSensitiveTest.init(BaseContextSensitiveTest.java:64)
J'ai tous les fichiers de mapping hibernate en place et la base de données est déjà en place avec pas de données. Drôle de chose (ou ennuyeux en fonction de la façon dont vous le regardez), c'est que si je change l'ordre des tables dans le jeu de données, la missingtableexception se plaint d'une autre table... soit par l'utilisateur, de réservation ou d'état.
Toutes les suggestions sur ce que je fais de mal?
Fiandesio, entendez-vous lors de la création de IDatabaseConnection dbUnitConn = new DatabaseConnection(connexion, "SCHÉMA?NAME")?
Non, je veux dire dans le dataset xml fichier <table name="statut"> devient <table name="monschema.le statut de">
Comment est-ce que votre chaîne de connexion JDBC?
Fiandesio: j'ai essayé, mais obtenir la même erreur. seulement avec le nom de schéma ajouté à la "table manquante".
OriginalL'auteur | 2011-02-21
Vous devez vous connecter pour publier un commentaire.
J'ai aussi rencontré ce même message d'erreur et l'on a accepté la correction ci-dessus n'a pas résolu mes problèmes. Cependant, j'ai été en mesure de trouver la solution.
Mon installation se composait de DBUnit(2.4), EclipseLink(2.1), comme mon fournisseur JPA, et Postgres comme mon backend de base de données. Aussi, dans mon scénario, j'étais pas en train de tomber et de recréer les tables pour chaque série de tests. Mes données de test existait déjà. Mauvaise pratique, je sais, mais c'était plus un test et de prototypage scénario. Le code ci-dessous illustre la DBUnit de configuration utilisé pour résoudre mon problème.
Deux choses dans le code ci-dessus fixé mon problème. J'ai d'abord nécessaire de définir le schéma DBUnit à utiliser. Qui est fait sur la ligne 57 ci-dessus. Lorsque la nouvelle DatabaseConnection est défini, le schéma("public") doit être passé si elle n'est pas null.
Deuxièmement, j'ai besoin d'DBUnit à la casse sur la base de données des noms de table. Dans mon DBUnit fichier xml("mydbunitdata.xml") les noms des tables sont minuscules comme ils sont dans la base de données. Toutefois, si vous ne dites pas DBUnit à utilisation sensible à la casse des noms de table, il semble pour la majuscule des noms de table qui Postgres n'aime pas. J'avais donc besoin de définir la casse fonctionnalité dans DBUnit qui est effectué sur la ligne 59.
avec dbunit 2.4.5 et, il en est un soutien spécifique pour postgres, et vous pouvez obtenir ces options en utilisant simplement: DatabaseConfig dbUnitConConfig = dbUnitCon.getConfig(); dbUnitConConfig.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, de nouvelles PostgresqlDataTypeFactory());
court et au point, vous me sauver!
Pour moi en passant le nom du schéma dans
DatabaseConnection
constructeur résolu le problème, même si j'ai été le précisant dans la base de données URL elle-même.OriginalL'auteur loyalBrown
de supprimer la première ligne de votre dataset.xml fichier
<!DOCTYPE dataset>
et le remplacer par cette
<?xml version='1.0' encoding='UTF-8'?>
sinon DBUnit essaie de charger les tables db schéma à partir d'un fichier DTD et si pas de DTD, il ne sera jamais de match sur toutes les tables. À l'aide de la plaine de l'en-tête xml sera la cause de DBUnit ignorer cette DTD - table de vérifier que c'est jeter de l'erreur que vous voyez.
Vous devez également faire ce Grzegorz fait et ont hibernate faire un create-drop pour vos tables en y
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
ou
configuration.setProperty(Environment.HBM2DDL_AUTO, "create-drop");
OriginalL'auteur Reticulogic
DBUnit ne va pas créer des tables de base de données pour vous, car il dispose d'informations limitées de l'ensemble de données xml pour créer la destination schéma de base de données.
Lorsque utilisé en tandem avec la veille prolongée, il faudra de la bonne hbm mappage de fichiers pour tous les pojo (que vous essayez de carte pour le test de la mémoire tables de base de données), qui est en fin de compte utilisée dans les tests. Sans les fichiers de mappage, vous obtiendrez la
org.dbunit.dataset.NoSuchTableException: Did not find table 'xxx' in schema 'yyy'
.Aussi, un valide hibernate.cfg.xml est nécessaire, correctement configuré avec tous les fichiers de mapping hibernate.
Vous pouvez déléguer la création de base de données à hibernate par la définition de cette propriété
hibernate.hbm2ddl.auto=create-drop
dans votre fichier de propriétés.Le message d'erreur est un peu trompeur. Doit probablement contenir plus d'informations à l'effet de manque des fichiers de mapping hibernate-mais c'est une discussion sur la DBunit wiki.
OriginalL'auteur
Avez-vous créé la base de données des tables dans votre base de données?
dbunit
ne le ferai pas pour vous, car il ne sait pas l'intention structure de base de données. Cependant, vous pouvez demander Hibernat de le faire. Utiliser lehbm2ddl
drapeau, par exemple:Je ne pouvais pas trouver la principale source de documentation pour le drapeau, mais si vous avez effectué une recherche pour vous d'obtenir beaucoup de résultats, incl. http://docs.jboss.org/ejb3/docs/reference/build/reference/en/html/entityconfig.html
Merci @Grzegorz Oledzki: Vous aviez raison que dbunit doesnot créer les tables pour moi dans mon databse. Si ce n'était pas le problème, le problème c'est que j'avais oublié d'ajouter mes fichiers de mapping pour l'hibernate.cfg.xml fichier-je timidement à l'admettre. Cependant, j'avais demandé à hibernate de le faire à l'aide de cette mise en veille prolongée.hbm2ddl.auto=create-drop comme un bien dans mon fichier de propriétés. Je ne suis pas sûr que je devrais marque de vous répondre que la bonne même si elle a ajouté à la solution du problème. J'apprécie vraiment votre aide les gars. Merci beaucoup, son travail maintenant!
Publier vos résultats comme une réponse distincte et de l'accepter.
OriginalL'auteur Grzegorz Oledzki
Vous pouvez être intéressé par cette. J'ai trouvé cette erreur et en renommant mon tableau dans le hibernate.cfg.xml de "message" à "MESSAGE", Il a été en mesure de trouver le schéma.
Laissez-moi savoir si cela fonctionne pour vous aussi.
OriginalL'auteur Matthew van Buuren
J'ai couru dans la même erreur et avait à la fois mon entité configuré dans hibernate.cfg.xml et j'ai été en utilisant hbm2ddl pour générer les tables, j'ai donc cherché et trouvé que mon entité à la cartographie que contient un champ nommé "POSITION" qui est réservé à terme. Quand je l'ai changé pour "POS" le tableau a été correctement généré.
Vous pouvez vérifier si votre tableau est généré par le débogage de la resultSet itération dans
org.dbunit.la base de données.DatabaseDataSet.initialize().
OriginalL'auteur Julius