2010-12-22 80 views
32

http://www.vaannila.com/spring/spring-hibernate-integration-1.html是否休眠创建数据库中的表自动

在阅读本教程中,他们并没有在创建的数据库表中提到的任何东西。 Hibernate是否会在我指定它们时通过创建表和字段来自动处理它。

这是我的beans配置。

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:p="http://www.springframework.org/schema/p" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" /> 

    <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
     <property name="url" value="jdbc:mysql://127.0.0.1:3306/spring"/> 
     <property name="username" value="monwwty"/> 
     <property name="password" value="www"/> 
    </bean> 

    <bean id="mySessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
     <property name="dataSource" ref="myDataSource" /> 
     <property name="annotatedClasses"> 
      <list> 
       <value>uk.co.vinoth.spring.domain.User</value> 
      </list> 
     </property> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
       <prop key="hibernate.show_sql">true</prop> 
       <prop key="hibernate.hbm2ddl.auto">create</prop> 
      </props> 
     </property> 
    </bean> 

    <bean id="myUserDAO" class="uk.co.vinoth.spring.dao.UserDAOImpl"> 
     <property name="sessionFactory" ref="mySessionFactory"/> 
    </bean> 

    <bean name="/user/*.htm" class="uk.co.vinoth.spring.web.UserController" > 
     <property name="userDAO" ref="myUserDAO" /> 
    </bean> 

</beans> 

回答

49

您的hibernate.hbm2ddl.auto设置应确定所创建的数据库(选项validatecreateupdatecreate-drop

23

是的,它在你的情况下,因为你的配置下面的属性。在测试过程中这是可以的,但在生产中您需要禁用此功能。

<prop key="hibernate.hbm2ddl.auto">create</prop> 
+0

你能详细说明为什么在制作过程中禁用这个功能是明智的吗? – 2013-06-17 20:52:28

+1

“内置的Hibernate连接池决不适合生产使用,它缺少可在生产就绪连接池中找到的几项功能。“http://docs.jboss.org/hibernate/orm/4.2/quickstart/en-US/html/ch02.html – 2013-07-06 17:29:16

5

是,Hibernate可以通过在hibernate.hbm2ddl.auto财产的方式配置hibernate.cfg.xml文件在数据库中自动创建表格,以便在表格不存在时将实体存储在其中。

在开发过程中,这可以很方便,可以使用新的,in-memory, DB,并在应用程序的每次运行或测试过程中创建一个新的数据库。

5

对我而言,即使hibernate.hbm2ddl.auto设置为update也无法正常工作。事实证明,生成的创建SQL无效,因为我的列名(user)之一是SQL关键字。这轻轻地失败了,直到我检查日志之前发生了什么并不明显。

-1

是的,你可以使用

<property name="hbm2ddl.auto" value="create"/> 
5

附加下列财产在你的hibernate.cfg.xml文件

<property name="hibernate.hbm2ddl.auto">update</property>

顺便说一句,在你的实体类,你必须定义@Id像申请这个:

@Id 
@GeneratedValue(generator = "increment") 
@GenericGenerator(name = "increment", strategy = "increment") 
@Column(name = "id") 
private long id; 

如果你使用下面的定义,那么m aybe不行:

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name = "id") 
private long id; 
0

Hibernate可以创建一个表,休眠用于代表你许多一对多映射序列和表格,你必须通过调用的setProperty(“hibernate.hbm2ddl.auto”明确地将其配置,“创建”)的配置对象。默认情况下,它仅使用数据库验证架构,如果通过提供错误“ORA-00942:表或视图不存在”而导致任何内容不存在,则会失败。

如果你做了上面的配置,那么执行的操作顺序将为: - a)删除所有表和序列,如果它们不存在,则不要给出错误。 b)创建所有表和序列 c)更改具有约束的表 d)向其中插入数据。