2008-11-20 43 views
85

我有以下的實體類(在Groovy):休眠:自動創建/基於實體類更新數據庫表

import javax.persistence.Entity 
import javax.persistence.Id 
import javax.persistence.GeneratedValue 
import javax.persistence.GenerationType 

@Entity 
public class ServerNode { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    Long id 

    String firstName 
    String lastName 


} 

和我的persistence.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0"> 

    <persistence-unit name="NewPersistenceUnit"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <properties> 
      <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/Icarus"/> 
      <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/> 
      <property name="hibernate.connection.username" value="root"/> 
      <property name="hibernate.connection.password" value=""/> 
      <property name="hibernate.archive.autodetection" value="class"/> 
      <property name="hibernate.show_sql" value="true"/> 
      <property name="hibernate.format_sql" value="true"/> 
      <property name="hbm2ddl.auto" value="create"/> 
     </properties> 
     <class>net.interaxia.icarus.data.models.ServerNode</class> 
    </persistence-unit> 
</persistence> 

和腳本:

import javax.persistence.EntityManager 
import javax.persistence.EntityManagerFactory 
import javax.persistence.Persistence 
import net.interaxia.icarus.data.models.ServerNode 

def factory = Persistence.createEntityManagerFactory("NewPersistenceUnit") 
def manager = factory.createEntityManager() 

manager.getTransaction().begin() 

manager.persist new ServerNode(firstName: "Test", lastName: "Server") 

manager.getTransaction().commit() 

數據庫'Icarus'存在,但目前沒有表。我希望Hibernate根據實體類自動創建和/或更新表。我將如何實現這一目標?

回答

87

得到這個我不知道,如果離開hibernate關閉前有差別。

reference表明,它應該是hibernate.hbm2ddl.auto

create值將創建您在SessionFactory的創建表,並讓他們保持不變。

create-drop將創建您的表,然後在關閉sessionFactory時將其刪除。

也許你應該明確設置javax.persistence.Table註釋?

希望這會有所幫助。

+9

這是hbm2dll.auto開頭缺失的'hibernate'。謝謝! – 2008-11-20 21:36:08

+0

我剛剛刪除了那一行,它不會刪除表格。希望這可以幫助! – Meinkraft 2015-10-13 03:25:10

72

你可以嘗試改變你的persistence.xml這條線從

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

到:

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

據說這是爲了保持該模式遵循所做的任何更改示範每次你運行該應用程序。

JavaRanch

8

有時取決於如何設置配置,屬性標記的長格式和短格式也可以有所不同。

例如如果您有它喜歡:

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

嘗試將其更改爲:

<property name="hibernate.hbm2ddl.auto">create</property> 
-3

休眠打開hbm2ddl.auto

自動驗證或出口模式的DDL在數據庫中創建了一個SessionFactory時。使用create-drop,當SessionFactory顯式關閉時,數據庫模式將被刪除。 例如驗證|更新|創建|創造和投入

請檢查link瞭解更多詳情。

0

有一個非常重要的細節,可能會阻止你的休眠生成表(假設你已經設置了hibernate.hbm2ddl.auto)。您還需要@Table註釋!

@Entity 
@Table(name = "test_entity") 
    public class TestEntity { 
} 

它在我的情況下,至少3倍,已經幫助 - 還是沒有記住它;)

PS。閱讀休眠文檔 - 在大多數情況下,您可能不希望將hibernate.hbm2ddl.auto設置爲create-drop,因爲它會在停止應用程序後刪除您的表格。

0

在applicationContext.xml文件:

<bean id="entityManagerFactoryBean" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <!-- This makes /META-INF/persistence.xml is no longer necessary --> 
     <property name="packagesToScan" value="com.howtodoinjava.demo.model" /> 
     <!-- JpaVendorAdapter implementation for Hibernate EntityManager. 
      Exposes Hibernate's persistence provider and EntityManager extension interface --> 
     <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> 
     </property> 
     <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.hbm2ddl.auto">update</prop> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> 
     </props> 
     </property> 
    </bean> 
0

在我的情況表中沒有爲第一次沒有最後一個屬性創建如下:

<properties> 
    <property name="hibernate.archive.autodetection" value="class"/> 
    <property name="hibernate.show_sql" value="true"/> 
    <property name="hibernate.format_sql" value="true"/> 
    <property name="hbm2ddl.auto" value="create-drop"/> 
    <!-- without below table was not created --> 
    <property name="javax.persistence.schema-generation.database.action" value="drop-and-create" /> 
</properties> 

使用Wildfly的內存數據庫H2