Si vous souhaitez importer des lignes dans Oracle et que vous rencontrez des problèmes avec l'ordre de vos données, vous pouvez désactiver toutes les clés étrangères et, une fois l'importation terminée, vous pouvez les réactiver. Si quelque chose dans vos données est erronée, vous obtenez un message d'erreur. J'ai ajouté une classe d'aide Bootstrap. J'utilise Spring et vous pouvez initialiser cette classe en définissant dataSource, un indicateur si les données doivent être chargées, un fichier de propriétés avec les noms des tables devant être nettoyées avant l'importation et le jeu de données dbunit.
Exemple d'appel (printemps et les fichiers doivent être contenus dans classpath):
<bean id="bootLoader" class="com.esentri.bootstrap.BootDataLoader">
<constructor-arg index="0"><ref bean="dataSource"/></constructor-arg> <!-- dataSource -->
<constructor-arg index="1" value="true"/> <!-- initializeTestData -->
<constructor-arg index="2" value="${profile.environment}"/> <!-- environmentName -->
<constructor-arg index="3" value="bootstrap/cleanUpDataSource.properties"/> <!-- cleanUpDataSourcePath -->
<constructor-arg index="4" value="bootstrap/defaultData.xml"/> <!-- dataSourcePath -->
</bean>
Et la classe est:
public BootDataLoader(DataSource dataSource, String initializeTestData, String environmentName, String cleanUpDataSourcePath, String dataSourcePath){
logger.info("================================================================================");
logger.info(" Start Bootstrapping: BootLoader initialized...");
//skip importing data if this const-arg is set to false or if environment is not development
if(initializeTestData.equals("false") || (!environmentName.equals("dev") && !environmentName.equals("test"))) {
logger.warn("--------------------------------------------------------------------------------------------");
logger.warn("DATABASE DATA IMPORT IS DISABLED (initializeTestData="+initializeTestData.toString()+", environmentName="+environmentName.toString());
logger.warn(" BootLoading will be terminated...");
logger.warn("--------------------------------------------------------------------------------------------");
return;
}
logger.warn("--------------------------------------------------------------------------------------------");
logger.warn("OVERRIDING DATABASE WITH TEST DATA. TURN ON INFO TO SEE DETAILS");
logger.warn("--------------------------------------------------------------------------------------------");
logger.info("JVM DEFAULT CHARSET = '" + Charset.defaultCharset() +"'");
logger.info("cleanUpDataSourcePath = '" + cleanUpDataSourcePath +"'");
logger.info("dataSourcePath = '" + dataSourcePath +"'");
logger.info("connect to database...");
Connection con = null;
IDatabaseConnection dbUnitCon = null;
try {
con = DataSourceUtils.getConnection(dataSource);
dbUnitCon = new DatabaseConnection(con);
} catch(DatabaseUnitException e) {
e.printStackTrace();
}
DatabaseConfig config = dbUnitCon.getConfig();
config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new Oracle11DataTypeFactory());
config.setProperty(DatabaseConfig.FEATURE_QUALIFIED_TABLE_NAMES, false);
config.setProperty(DatabaseConfig.FEATURE_SKIP_ORACLE_RECYCLEBIN_TABLES, true);
//LOAD DATASET
logger.info("load dataSet from dataSource...");
FlatXmlDataSetBuilder builder = new FlatXmlDataSetBuilder();
builder.setColumnSensing(true);
IDataSet dataSet = null;
try {
ClassLoader cl = Thread.currentThread().getContextClassLoader();
InputStream is = cl.getResourceAsStream(dataSourcePath);
dataSet = builder.build(is);
} catch (Exception e) {
logger.error("Failed loading BootLoad dataSource '"+dataSourcePath+"'");
e.printStackTrace();
}
logger.info("...done");
//CLEAN TABLES
logger.info("clean tables defined in cleanUpDataSource...");
Properties props = new Properties();
String table;
String del = "DELETE FROM ";
try {
ClassLoader cl = Thread.currentThread().getContextClassLoader();
InputStream is = cl.getResourceAsStream(cleanUpDataSourcePath);
props.load(is);
} catch (Exception e) {
logger.error("Failed loading BootLoad cleanUpDataSource '"+cleanUpDataSourcePath+"'");
e.printStackTrace();
}
Iterator it = props.keySet().iterator();
Statement stmt;
while (it.hasNext()){
table = (String)it.next();
logger.info(" DELETE FROM "+table);
try {
stmt = con.createStatement();
stmt.execute(del+table);
stmt.close();
con.commit();
} catch (Exception e) {
logger.error("Error cleaning table '"+table+"'");
e.printStackTrace();
}
}
logger.info("...done");
//DISABLE ALL FOREIGN KEYS
logger.info("disable all foreign keys...");
try {
Statement stmtDisableAllConstaints;
String disableAllConstaints =
" begin" +
" for i in (select constraint_name, table_name from user_constraints where constraint_type ='R' and status = 'ENABLED') LOOP" +
" execute immediate 'alter table '||i.table_name||' disable constraint '||i.constraint_name||'';" +
" end loop;" +
" end;";
stmtDisableAllConstaints = con.createStatement();
stmtDisableAllConstaints.execute(disableAllConstaints);
stmtDisableAllConstaints.close();
con.commit();
} catch (Exception e) {
logger.error("Error disabling foreign keys");
e.printStackTrace();
}
logger.info("...done");
//IMPORT DATA
logger.info("import data from '"+dataSourcePath+"'");
try {
DatabaseOperation.CLEAN_INSERT.execute(dbUnitCon,dataSet);
} catch (Exception e) {
logger.error("Error importing data");
e.printStackTrace();
}
logger.info("...done");
//ENABLE FOREIGN KEYS
logger.info("enable all foreign keys...");
try {
Statement stmtEnableAllConstaints;
String disableAllConstaints =
" begin" +
" for i in (select constraint_name, table_name from user_constraints where constraint_type ='R' and status = 'DISABLED') LOOP" +
" execute immediate 'alter table '||i.table_name||' enable constraint '||i.constraint_name||'';" +
" end loop;" +
" end;";
stmtEnableAllConstaints = con.createStatement();
stmtEnableAllConstaints.execute(disableAllConstaints);
stmtEnableAllConstaints.close();
con.commit();
} catch (Exception e) {
logger.error("Error enabling foreign keys");
e.printStackTrace();
}
logger.info("...done");
//CLOSE CONNECTION
logger.info("close connection");
DataSourceUtils.releaseConnection(con, dataSource);
logger.info("...done");
logger.info(" BootLoader ended");
logger.info("================================================================================");
}
Merci! Mais le problème était: j'ai utilisé la connexion db via internet. C'était trop lent pour ça. – Sisak