Hibernate创建MySQL模式(schema)如果不存在

5
我正在使用Spring 3和Hibernate 4。
这是我的root-context.xml文件。
<bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="url" value="jdbc:mysql://localhost:3306/musicstore"></property>
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="username" value="root"></property>
        <property name="password" value="123456"></property>
    </bean>


    <bean id="sessionFactory" name="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"></property>

        <property name="hibernateProperties">
            <props>     
                <prop key="hibernate.dialect"> org.hibernate.dialect.MySQLDialect </prop>
                <prop key="hibernate.max_fetch_depth">3</prop>
                <prop key="hibernate.jdbc.fetch_size">50</prop>
                <prop key="hibernate.jdbc.batch_size">10</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>

            </props>
        </property>
        <property name="packagesToScan" value="domain" /><!-- 
            entity -->
    </bean>

我有这个:
WARN : org.hibernate.engine.jdbc.internal.JdbcServicesImpl - HHH000342: Could not obtain connection to query metadata : Unknown database 'musicstore'

当我在Tomcat中部署我的项目时,我希望Hibernate会在架构不存在的情况下创建它。我尝试了hibernate.hbm2ddl.auto=create,但它没有起作用。
有没有办法在运行时自动创建模式?任何建议都将有所帮助:D
提前致谢。

阅读https://dev59.com/SHRC5IYBdhLWcg3wAcXU。 - Reimeus
@Reimeus 谢谢您的建议,我已经尝试了 hibernate.hbm2ddl.auto= create,但它并没有创建数据库模式。 - Nessaj Nguyen
为什么Hibernate不会为MySQL创建数据库? - sushama Lanke
3个回答

22

我不知道如何用Hibernate的特定方式解决你的问题,但MySQL的一个好处是(至少在某些条件下)你可以通过在连接字符串的末尾添加"?createDatabaseIfNotExist=true"来指定如果数据库不存在,则创建数据库本身。

因此,通过将你的Spring配置更改为以下内容,你应该能够得到所需的结果。

<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="url" value="jdbc:mysql://localhost:3306/musicstore?createDatabaseIfNotExist=true"></property>
    <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
    <property name="username" value="root"></property>
    <property name="password" value="123456"></property>
</bean>


<bean id="sessionFactory" name="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource"></property>

    <property name="hibernateProperties">
        <props>     
            <prop key="hibernate.dialect"> org.hibernate.dialect.MySQLDialect </prop>
            <prop key="hibernate.max_fetch_depth">3</prop>
            <prop key="hibernate.jdbc.fetch_size">50</prop>
            <prop key="hibernate.jdbc.batch_size">10</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>

        </props>
    </property>
    <property name="packagesToScan" value="domain" /><!-- 
        entity -->
</bean>

值得注意的是,我对此除了它能够工作之外一无所知,因此它可能具有我不知道的限制。


4
谢谢这个技巧。jdbc:mysql://localhost:3306/musicstore?createDatabaseIfNotExist=true注:此为连接数据库的URL。 - vvator

0
Hibernate需要数据库存在:它无法帮助您创建数据库。如果您需要创建数据库,则需要实现另一种解决方案,在Hibernate初始化之前执行。
由于您正在使用Spring,因此以下内容可能有用于执行初始的“CREATE DATABASE X”语句。

http://docs.spring.io/spring-framework/docs/3.0.0.RC3/reference/html/ch12s09.html

显然,您需要确保初始化在sessionFactory bean初始化之前执行。

您还很可能会定义两个数据源,一个按照mretierer提供的链接(从Java创建MySQL数据库)所概述的配置一样,即未定义任何数据库,并且由Spring db 初始化器bean使用,另一个用于Hibernate,引用在初始化期间创建的数据库。

不知道这些是否有效,但看起来是可行的...


我已经将这段代码片段添加到我的root-context.xml文件中,但它没有起作用 :( <jdbc:initialize-database data-source="dataSource"> <jdbc:script location="classpath:src/test/resources/import.sql" /> </jdbc:initialize-database> - Nessaj Nguyen

-2
首先回答你的问题:你已经提供的属性应该可以实现你所要求的功能。
   <prop key="hibernate.hbm2ddl.auto">update</prop>

你遇到的异常指向了一个不同的问题。Hibernate 无法连接到你指定的数据库。

请检查你的连接字符串。

 <property name="url" value="jdbc:mysql://localhost:3306/musicstore"></property>

在我看来,“musicstore”是数据库名称。因此,如果数据库存在,它应该可以工作。 - mreiterer
如果MySQL中存在数据库模式“musicstore”,它只会创建表,但我希望Hibernate在不存在时创建一个名为“musicstore”的数据库。 - Nessaj Nguyen
2
我明白了。请看:https://dev59.com/tXRB5IYBdhLWcg3wHkLi - mreiterer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接