在 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 中创建数据库