如果不存在mysql,则hibernate创建模式

时间:2014-10-09 07:53:36

标签: java mysql hibernate spring-mvc

我使用的是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

提前致谢。

3 个答案:

答案 0 :(得分:15)

我不知道如何以特定于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>

值得注意的是,我对它的了解不多于它的工作原理,所以它很可能有我不知道的局限性。

答案 1 :(得分:0)

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

当您使用Spring时,以下可能对于执行初始&#39;创建数据库X&#39;声明。

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使用,它引用初始化期间创建的数据库。

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

答案 2 :(得分:-1)

首先回答你的问题:你提供的财产应该按照你的要求行事。

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

您获得的例外是指另一个问题。 Hibernate无法连接到您指定的数据库。

请检查您的连接字符串

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