在 Hibernate 中的启动数据库中创建 mysql

Posted

技术标签:

【中文标题】在 Hibernate 中的启动数据库中创建 mysql【英文标题】:Create mysql at startup db within Hibernate 【发布时间】:2014-12-30 10:26:21 【问题描述】:

我正在编写 spring mvc 项目。我想在我的应用程序启动时创建 mysql 数据库。试图读取文件“import.sql”。 我得到了一个错误:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database 'test3'

这是我的 spring-servlet.xml:

    <context:annotation-config />
<context:component-scan base-package="com.joseph" />    


<bean id="propertyConfigurer"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
    p:location="/WEB-INF/jdbc.properties" />

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close" p:driverClassName="$jdbc.driverClassName"
    p:url="$jdbc.databaseurl" p:username="$jdbc.username" p:password="$jdbc.password" />


<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation">
        <value>classpath:hibernate.cfg.xml</value>
    </property>
    <property name="configurationClass">
        <value>org.hibernate.cfg.AnnotationConfiguration</value>
    </property>
    <property name="hibernateProperties">
    <value>
        hibernate.dialect=$hibernate.dialect
        hibernate.jdbc.batch_size=$hibernate.jdbc.batch_size
        hibernate.show_sql=$hibernate.show_sql
        hibernate.hbm2ddl.auto=$hibernate.hbm2ddl.auto
        hibernate.id.new_generator_mappings=$hibernate.id.new_generator_mappings
        hibernate.hbm2ddl.import_files=$hibernate.hbm2ddl.import_files

     </value>
</property>

</bean>


<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <property name="suffix" value=".jsp"/>
</bean>
<tx:annotation-driven />

<bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean> 

和 jdbc.properties:

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.dialect=org.hibernate.dialect.MySQLDialect
jdbc.databaseurl=jdbc:mysql://localhost:3306/test3  
jdbc.username=root
jdbc.password=root

    #org.hibernate.dialect.PostgreSQLDialect
    hibernate.dialect=org.hibernate.dialect.MySQLDialect
    hibernate.show_sql = true
    hibernate.id.new_generator_mappings = true
    hibernate.hbm2ddl.auto = create
    hibernate.jdbc.batch_size = 5
    hibernate.transaction.factory_class=org.transaction.JDBCTransactionFactory
    hibernate.hbm2ddl.import_files = import.sql 

import.sql

CREATE SCHEMA IF NOT EXISTS test3;

hibernate.cfg.xml

<hibernate-configuration>
    <session-factory>   
     <mapping class="com.joseph.model.Student" />        
    </session-factory>         
</hibernate-configuration>

【问题讨论】:

因为没有test3 的数据库不存在。您应该首先创建一个名为test3 的数据库(模式),然后在应用程序启动期间,您的表将被创建。 就是这样。如何在应用程序启动时自动创建架构? 自动生成模式(甚至表)不是一个好主意。见Hibernate/JPA DB Schema Generation Best Practices 我知道,但无论如何这正是我的任务。 【参考方案1】:

在资源中添加import.sql文件如下:

/*create database at first time*/ 
CREATE SCHEMA your-database-name;

'hibernate.cfg.xml'如下:

<hibernate-configuration>
    <session-factory>
       ...
       ...
       <property name="hbm2ddl.import_files">import.sql</property>
       ...
       ...
    </session-factory>
</hibernate-configuration>

也可以参考这个以编程方式执行this

【讨论】:

这个解决方案的问题是休眠首先尝试连接到数据库(方案),然后才进入 import.sql 并创建一个新方案(根据文件上下文)。怎么下单?

以上是关于在 Hibernate 中的启动数据库中创建 mysql的主要内容,如果未能解决你的问题,请参考以下文章

如何在 IntelliJ 和 H2 中创建 Hibernate 映射

Hibernate 不使用 Spring boot 在 PostgreSql 中创建数据库

如何在 Hibernate 中创建 OneToMany 映射? [复制]

如何在 Hibernate 中创建多态/通用多对多关系?

如何在 Hibernate 中创建/调用 sql 视图

休眠:创建索引