2010-12-22 46 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)向其中插入數據。