2016-03-06 1 views
0

Je souhaite créer une vue dans Derby RDBMS lorsque ma WebApp démarre (ApplicationListener.contextInitialized) si elle n'existe pas encore. En ce moment, il n'y a pas de transaction, donc je dois utiliser JDBC & SQL. Mes essais avec DatabaseMetaData.getTables() n'ont pas réussi. Il renvoie toujours un ensemble de résultats vide mais je peux voir dans l'onglet Services dans NetBeans qu'il existe définitivement (et la table demandée aussi). Le code:Comment créer une vue de base de données manquante dans Derby?

public isDBViewExists(Connection conn_, String catalogName_, String schemaName_, String viewName_) throws SQLException 
{ 
    conn_.setAutoCommit(false); 
    DatabaseMetaData metadata = conn_.getMetaData(); 
    ResultSet rs = metadata.getTables(catalogName_, schemaName_, viewName_, new String[] { "VIEW" }); 
    return rs.next(); 
} 

La connexion créée par la ressource DataSource injectée dans le gestionnaire d'événements de contexte de l'application:

@Resource(name="jdbc/x") 
DataSource ds; 
... 
try 
{ 
    Connection conn = ds.getConnection(); 
    if (isDBViewExists(conn, ...)) 
    ... 
} 
finally 
{ 
    conn.close(); 
} 

Tous les noms passés sont en MAJUSCULES (catalogue, schéma, vue/tableau). Le conn_ n'est pas nul. Quelle est ma faute?

Répondre

1

Dans ce cas, il est probablement plus facile de créer simplement la table et d'ignorer la SQLException qui revient si la table existe déjà. Laissez la DB s'inquiéter de vérifier si la table existe déjà.

Par exemple:

Connection conn = ds.getConnection() 
try { 
    conn.createStatement().executeUpdate("CREATE TABLE ...."); 
} finally { 
    conn.close(); 
} catch(SQLException ignore) { 
    // ignore exception, not much can go wrong here except for the table already existing. 

    // If you don't mind making vendor specific logic, check the error message for "already exists" or some equivalent 
    if(!ignore.getMessage().contains("already exists")) 
    throw ignore; 
}