2008-11-20 69 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