【问题标题】:hibernate create schema if not exists mysql如果不存在mysql,则休眠创建模式
【发布时间】:2014-12-04 01:40:03
【问题描述】:

我正在使用 Spring 3 和休眠 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

提前致谢。

【问题讨论】:

标签: java mysql hibernate spring-mvc


【解决方案1】:

我不知道如何以特定于休眠的方式解决您的问题,但是 MySQL 的一个很酷的事情是您可以(至少在某些条件下)指定要创建的数据库本身,如果它没有通过在末尾附加“?createDatabaseIfNotExist=true”,t 已经通过连接字符串存在。

因此,通过将 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>

值得注意的是,除了它的工作原理之外,我对此一无所知,因此它很可能存在我不知道的局限性。

【讨论】:

  • 感谢这个 hack jdbc:mysql://localhost:3306/musicstore?createDatabaseIfNotExist=true
【解决方案2】:

Hibernate 要求数据库存在:它不能帮助您创建数据库。如果您需要创建数据库,您将需要实现另一个在 Hibernate 初始化之前执行的解决方案。

当您使用 Spring 时,以下 可能对于执行初始的“CREATE DATABASE X”语句很有用。

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

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

您还可能可能定义 2 个数据源,一个按照 mretierer (Create MySQL database from Java) 提供的链接中的概述进行配置,即没有定义数据库并且由 Spring db 初始化程序 bean 使用,另一个供 Hibernate 使用,它引用在初始化期间创建的数据库。

不知道这是否可行,但看起来可行......

【讨论】:

  • 我已经在我的 root-context.xml 中添加了这段代码,但它不起作用:(
【解决方案3】:

首先回答您的问题:您已经提供的属性应该满足您的要求。

   <prop key="hibernate.hbm2ddl.auto">update</prop>

您遇到的异常是指不同的问题。 Hibernate 无法连接到您指定的数据库。

请检查您的连接字符串

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

【讨论】:

  • 在我看来“musicstore”是数据库名称。所以如果数据库存在,它应该可以工作
  • 如果数据库模式“musicstore”存在于mysql中,它只是创建表,但我希望hibernate会创建一个数据库“musicstore”,如果它不存在。
  • 我明白了。看看:stackoverflow.com/questions/717436/…
猜你喜欢
  • 2018-11-28
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
  • 2013-10-28
  • 2012-11-01
  • 1970-01-01
  • 2014-11-02
  • 2016-11-09
相关资源
最近更新 更多