Получение неизвестного исключения базы данных при программном создании схемы?

Я пытаюсь создать схему и таблицы программно, используя hibernate/GWT/Java. Я создал конфигурацию со всеми картографическими ресурсами и свойствами и т. д. следует,

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

но когда я говорю

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

это исключение, поскольку,

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)

мой файл cfg.xml:

<?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>

И если я создал схему вручную, то она работает нормально, т.е. также создает таблицы и столбцы. Но обычно схема не создается. Разве нельзя создать схему автоматически?


person milind_db    schedule 26.06.2013    source источник


Ответы (4)


Вам нужно добавить еще одно свойство в файл конфигурации спящего режима, чтобы автоматически создать базу данных/схему:

<property name="hibernate.hbm2ddl.auto">create</property>
person Juned Ahsan    schedule 26.06.2013
comment
Извините, у меня уже было это свойство в cfg.xml, но я забыл упомянуть... только что отредактировал файл. Спасибо. все же это дает такое же исключение. - person milind_db; 26.06.2013

Hibernate не будет создавать схему динамически... вам нужно создать ее вручную. Я использовал простое соединение JDBC и оператор для создания схемы, затем SchemaExport выполнит работу по созданию таблиц и полей. Таким образом, невозможно создать реальную схему с помощью спящего режима. Вы должны создать его вручную.

 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);

Это создаст полную схему, это сработало для меня.

person milind_db    schedule 01.08.2013

Я предполагаю, что hibernate создает схему только в случае создания database. Вам необходимо создать базу данных testschema вручную.

Создайте базу данных testschema вручную, а затем запустите приложение гибернации.

person Rais Alam    schedule 26.06.2013

Схемы можно создавать автоматически. Добавьте следующее свойство в XML-файл конфигурации Hibernate:

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

ИЛИ

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

Согласно приведенному выше свойству, Hibernate создаст базу данных только в том случае, если она еще не существует, и обновит все существующие таблицы, чтобы они соответствовали вашей текущей модели домена.

Еще один вариант:

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

Вышеприведенное свойство подразумевает, что Hibernate будет создавать новую базу данных каждый раз, когда вы запускаете приложение.

ОБНОВЛЕНИЕ: ПОЛЕЗНЫЕ URL

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/

person ColinWa    schedule 26.06.2013
comment
никаких изменений.. это дает такое же исключение. Я пробовал все варианты. Если вы когда-нибудь делали то же самое, пожалуйста, дайте мне какую-нибудь полезную статью или пост, на который можно сослаться. - person milind_db; 26.06.2013
comment
Я прошел по всем ссылкам, которые вы предоставили, но не нашел решения, даже не было примера генерации схемы программно. :( Теперь я не нашел никакого способа сделать генерацию схемы программой, поэтому мне нужно сначала сгенерировать схему с помощью JDBC, а затем запустить другой скрипт для генерации таблиц и полей. - person milind_db; 27.06.2013