2013-06-26 5 views
0

J'essaye de créer le schéma et les tables par programmation en utilisant hibernate/GWT/Java. J'ai créé la configuration avec toutes les ressources cartographiques et des propriétés, etc. follows,Obtention d'une exception de base de données inconnue lors de la création de schéma par programme?

Configuration hibConfiguration = new Configuration().configure(configFileDoc); 

mais quand je dis

SchemaExport schemaExport = new SchemaExport(hibConfiguration); 
schemaExport.create(true, true); 

il jette exception que,

ERROR: HHH000231: Schema export unsuccessful 

    com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database 'testschema' 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
     at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
     at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 
     at com.mysql.jdbc.Util.getInstance(Util.java:386) 
     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052) 
     at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3609) 
     at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3541) 
     at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:943) 
     at com.mysql.jdbc.MysqlIO.secureAuth411(MysqlIO.java:4113) 
     at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1308) 
     at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2336) 
     at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2369) 
     at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2153) 
     at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:792) 
     at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47) 
     at sun.reflect.GeneratedConstructorAccessor36.newInstance(Unknown Source) 
     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
     at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
     at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 
     at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:381) 
     at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:305) 
     at java.sql.DriverManager.getConnection(DriverManager.java:582) 
     at java.sql.DriverManager.getConnection(DriverManager.java:154) 
     at org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl.getConnection(DriverManagerConnectionProviderImpl.java:193) 
     at org.hibernate.tool.hbm2ddl.ManagedProviderConnectionHelper.prepare(ManagedProviderConnectionHelper.java:55) 
     at org.hibernate.tool.hbm2ddl.DatabaseExporter.<init>(DatabaseExporter.java:52) 
     at org.hibernate.tool.hbm2ddl.SchemaExport.execute(SchemaExport.java:367) 
     at org.hibernate.tool.hbm2ddl.SchemaExport.create(SchemaExport.java:304) 
     at org.hibernate.tool.hbm2ddl.SchemaExport.create(SchemaExport.java:293) 

mon cfg.xml file:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<hibernate-configuration> 
    <session-factory> 
     <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
     <property name="hibernate.connection.password">passwd</property> 
     <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
     <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/testSchema</property> 
     <property name="hibernate.connection.username">root</property> 
     <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property> 
     <property name="javax.persistence.validation.mode">none</property> 
     <property name="hibernate.temp.use_jdbc_metadata_defaults">false</property> 
     <property name="hibernate.default_entity_mode">dynamic-map</property> 
     <property name="hibernate.hbm2ddl.auto">create</property> 
    </session-factory> 
</hibernate-configuration> 

Et si j'ai créé manuellement le schéma, alors il fonctionne correctement, c'est-à-dire qu'il crée également des tables et des colonnes. Mais normalement, il ne crée pas de schéma, n'est-il pas possible de créer un schéma automatiquement?

Répondre

1

Hibernate ne crée pas le schéma dynamique ... vous devez créer manuellement.J'ai utilisé une simple connexion JDBC et une instruction pour créer un schéma, puis SchemaExport va faire le travail de générer les tables et les champs. Il n'y a donc aucun moyen de créer un schéma réel en utilisant Hibernate. Vous devez le créer manuellement.

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder = factory.newDocumentBuilder(); 
Document configFileDoc = builder.parse(new ByteArrayInputStream(configFileStr.getBytes())); 

Configuration hibConfiguration = new Configuration(); 
hibConfiguration.configure(configFileDoc); 
ArrayList<Document> hbmFileDocs = getHBMFileDocList(); //created the documents of the file string 
for(Document doc : hbmFileDocs) 
     hibConfiguration.addDocument(doc); 

hibConfiguration.buildMappings(); 
Class.forName("com.mysql.jdbc.Driver"); 
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/", "username", "password"); 
stmt = conn.createStatement(); 
String sql = "CREATE DATABASE "+schemaName; 
stmt.executeUpdate(sql); 
SchemaExport schemaExport = new SchemaExport(hibConfiguration); 
schemaExport.create(true, true); 

Cela générera le schéma complet, cela a fonctionné pour moi.

0

Vous devez ajouter une propriété dans votre fichier de configuration de mise en veille prolongée, pour créer la base de données/schéma automatiquement:

<property name="hibernate.hbm2ddl.auto">create</property> 
+0

Désolé, j'avais déjà cette propriété dans cfg.xml, mais j'ai oublié de mentionner .. juste modifié le fichier. merci. encore il donne la même exception. –

0

Je suppose que créer hibernate schéma uniquement en cas de database est créé. Vous devez créer la base de données testschema manuellement.

Créez manuellement la base de données testschema, puis démarrez votre application Hibernate.

-2

Il est possible de créer des schémas automatiquement. Ajoutez la propriété suivante à votre xml config Hibernate:

<property name="hibernate.hbm2ddl.auto">update</property> 

OU

<prop key="hibernate.hbm2ddl.auto">update</prop> 

Comme par la propriété ci-dessus, Hibernate ne fera que créer la base de données si elle n'existe pas déjà, et sera mettre à jour toutes les tables existantes pour correspondre à votre modèle de domaine actuel.

Un autre choix sera la suivante:

<property name="hibernate.hbm2ddl.auto">create-drop</property> 

La propriété ci-dessus implique que Hibernate va créer une base de données flambant neuf à chaque fois que vous lancez l'application

MISE À JOUR: URL UTILES

http://manikandanmv.wordpress.com/2011/04/13/hibernate-basics-simple-example/

http://khartig.wordpress.com/2008/12/20/dynamic-schema-and-database-creation-with-netbeans-hibernate-and-ejb3/

http://blog.sencide.com/2011/03/hibernate-tutorial-for-beginners.html

http://www.jroller.com/eyallupu/entry/hibernate_s_hbm2ddl_tool

http://hannelita.wordpress.com/2012/03/21/hibernate-cfg-hibernate-4-0-0/

+0

pas de changement..il donne la même exception. J'ai essayé toutes les options. Si vous avez déjà fait le même plz me donner un article utile ou un poste à consulter. –

+0

@milind_bharambe Vérifiez la mise à jour si cela vous aide – ColinWa

+0

J'ai parcouru tous les liens que vous avez fournis, mais je n'ai trouvé aucune solution, même s'il n'y avait aucun exemple de génération de schéma par programme. :( Maintenant, je ne trouve aucun moyen de faire la génération de schéma par programme, donc je dois d'abord générer un schéma en utilisant JDBC et ensuite exécuter un autre script pour la génération de tables et de champs. –

Questions connexes