Ausführen von DDL aus hibernate
Ich weiß, dass SchemaExport sollte mein Freund sein. Aber ich bin mit liquibase und möchten, führen Sie die DDL - Reine sql-Anweisungen generiert von liquibase neu erstellen, die Datenbank vor jeder test-Methode.
Sehen Sie Probleme mit dem folgenden code? Ich Frage mich, scheint so kompliziert zu sein ...
public static int executeScript(String sqlFileOnClasspath) {
Session sess = getSessionFactory().openSession();
Transaction ta = sess.beginTransaction();
int sqlCmd = 0;
try {
BufferedReader bReader = new BufferedReader(new InputStreamReader(
Util.class.getResourceAsStream(sqlFileOnClasspath), "UTF-8"));
String line;
while ((line = bReader.readLine()) != null) {
if (line.startsWith("--") || line.trim().isEmpty())
continue;
final String tmp = line;
sess.doWork(new Work() {
@Override
public void execute(Connection connection) throws SQLException {
connection.createStatement().execute(tmp);
}
});
sqlCmd++;
}
} catch (Exception ex) {
log.error("Couldn't execute " + sqlFileOnClasspath, ex);
} finally {
ta.commit();
sess.close();
}
return sqlCmd;
}
BTW: Für liquibase Sie tun müssen:
// remove all hibernate managed tables
SchemaExport schemaTool = new SchemaExport(getConfiguration());
schemaTool.drop(false, true);
// DROP TABLE DATABASECHANGELOGLOCK;
// DROP TABLE DATABASECHANGELOG;
executeScript("/drop-none-hib.sql");
// now execute the DDL statements from liquibase
int sqlCmd = executeScript("/schema.sql");
log.info("Executed " + sqlCmd + " sql commands");
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sicherheit
Direkt ausführen unvorbereitet Aussagen führen kann, um SQL-injection. Jedoch, Sie scheinen zu Lesen DDL-Anweisungen aus einer statischen Datei, also das sollte nicht das problem sein, wollte nur zu beachten, dass.
Ausnahmebehandlung
Fehlen komplett, z.B. ordnungsgemäß schließen Sie die input-streams, die Anschlüsse usw. Auch, es findet mit ausführlichen Informationen auf welche der Aussagen ist fehlgeschlagen, wenn einer der
SQLExceptions
geworfen werden.sqlCmd
variable zählt auch fehlgeschlagene Anweisungen, so bezweifle ich die Nützlichkeit dieses Indikators.Parsen von SQL - /DDL -
Testen für
--
Kommentare, aber nicht für/* */
Kommentare. Das wird beißen Sie einige Tag. Auch der parser nimmt eine SQL-Anweisung pro Zeile. Mehr Aussagen können mehrzeilige und enden mit Semikolon, die müssen getrimmt werden. Nicht sicher, wie liquibase generiert die Anweisungen, obwohl, so kann dies nicht zu einem realen problem werden.Transaction Handling
DDL-Anweisungen können nicht zurückgesetzt werden sowieso, also nicht sicher über die Transaktionen nützlich sein. Bitte korrigieren Sie mich, wenn ich falsch Liege.
Anders, als es für die Prüfung, ich sieht gut zu mir.
Warum nicht nutzen Sie einfach die hbm2ddl.auto Konfiguration?
Oder verwenden Transaktions-tests, die Rolle der Datenbank in den ursprünglichen Zustand nach jedem test?