【问题标题】:Getting unknown database exception while creating schema programmatically?以编程方式创建架构时出现未知数据库异常?
【发布时间】:2013-06-26 09:04:44
【问题描述】:

我正在尝试使用 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>

如果我手动创建了架构,那么它工作正常,即也可以创建表和列。但是一般不创建schema,是不是不能自动创建schema?

【问题讨论】:

    标签: java mysql hibernate hibernate-mapping schemaexport


    【解决方案1】:

    您需要在 hibernate 配置文件中再添加一个属性,以自动创建数据库/模式:

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

    【讨论】:

    • 对不起,我已经在 cfg.xml 中拥有该属性但忘了提及..刚刚编辑了文件。谢谢。它仍然给出同样的例外。
    【解决方案2】:

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

    这将生成完整的架构,它对我有用。

    【讨论】:

      【解决方案3】:

      我猜hibernate 仅在创建database 的情况下创建模式。您需要手动创建数据库testschema

      手动创建数据库testschema,然后启动您的休眠应用程序。

      【讨论】:

        【解决方案4】:

        可以自动创建模式。将以下属性添加到您的 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每次启动应用程序时都会创建一个全新的数据库

        更新:有用的网址

        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/

        【讨论】:

        • 没有变化..它给出了同样的例外。我尝试了所有选项。如果您曾经做过同样的事情,请给我一些有用的文章或帖子以供参考。
        • 我浏览了您提供的所有链接,但没有找到任何解决方案,即使没有以编程方式生成模式的示例。 :( 现在我没有找到通过程序生成模式的任何方法,所以我必须先使用 JDBC 生成模式,然后必须运行其他脚本来生成表和字段。
        猜你喜欢
        • 1970-01-01
        • 2012-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-11
        • 1970-01-01
        • 2019-12-19
        • 1970-01-01
        相关资源
        最近更新 更多