Получение неизвестного исключения из базы данных при программном создании схемы?
Я пытаюсь создать схему и таблицы программно с помощью 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>
И если я вручную создал схему, то она работает нормально, то есть создает таблицы и столбцы также. Но обычно это не создание схемы. Разве невозможно создать схему автоматически?
4 ответа
Hibernate не будет создавать схему динамически... вы должны будете создать ее вручную. Я использовал простое соединение JDBC и оператор для создания схемы, затем SchemaExport выполнит работу по генерации таблиц и полей. Таким образом, нет способа создать реальную схему, используя Hibernate. Вы должны создать его вручную.
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);
Это сгенерирует полную схему, это сработало для меня.
Вам нужно добавить еще одно свойство в конфигурационном файле hibernate, чтобы автоматически создать базу данных / схему:
<property name="hibernate.hbm2ddl.auto">create</property>
Похоже hibernate
создать схему только в случае database
создано. Вам необходимо создать базу данных testschema
вручную.
Создать базу данных testschema
вручную, а затем запустите приложение Hibernate.
Можно создавать схемы автоматически. Добавьте следующее свойство в конфигурационный файл Hibernate xml:
<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://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/