2014-10-09 57 views
1

我使用Spring 3和休眠4如果不存在MySQL的

这里休眠模式创造是我的根的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 =创建但它不起作用

有没有什么办法可以在运行时自动创建模式?任何建议将有所帮助:D

在此先感谢。

+0

阅读http:// stackoverflow。com/questions/438146/hibernate-hbm2ddl-auto-possible-values-and-what-they-do#1689769 – Reimeus 2014-10-09 07:57:15

+0

@Reimeus感谢您的建议,我尝试过hibernate.hbm2ddl.auto = create,但它并没有创建数据库架构也。 – 2014-10-09 08:12:42

+0

参考---> http://stackoverflow.com/questions/24632954/why-is-hibernate-not-creating-database-for-mysql – sush 2017-04-26 10:53:10

回答

-1

首先回答你的问题:你已经提供的财产应该做你所要求的。

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

你得到的例外指的是不同的问题。 Hibernate无法连接到您指定的数据库。

请检查您的连接字符串

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

在我看来,“musicstore”是数据库名称。所以如果数据库存在,它应该工作 – mreiterer 2014-10-09 08:23:25

+0

它只是在mysql中存在数据库模式“musicstore”时创建表,但是如果它不存在,我希望hibernate将创建一个数据库“musicstore”。 – 2014-10-09 08:24:02

+2

我明白了。看看:http://stackoverflow.com/questions/717436/create-mysql-database-from-java – mreiterer 2014-10-09 08:28:06

0

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

正如您使用Spring,以下可能对执行初始'CREATE DATABASE X'语句很有用。

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

显然,你需要确保SessionFactory的bean初始化之前的initailization执行。

你还能可能定义2点的数据源,一个配置为在规定的mretierer(Create MySQL database from Java)提供的链接,即没有数据库概述和使用由Spring DB初始化Bean及供Hibernate能够引用初始化期间创建的数据库。

不知道如果有这个工作,但看起来是可行的......

+0

我已添加此snipet代码在我的root-context.xml中,但它不工作:( \t \t \t 2014-10-09 13:58:38

10

我不知道如何解决你的问题,在一个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

thanx for this hack jdbc:mysql:// localhost:3306/musicstore?createDatabaseIfNotExist = true – vvator 2017-02-05 22:20:11