首页 文章

Hibernate:基于实体类自动创建/更新db表

提问于
浏览
92

我有以下实体类(在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基于实体类自动创建和/或更新表 . 我怎么做到这一点?

7 回答

  • 94

    我不知道离开前面的 hibernate 是否有所作为 .

    reference表明它应该是 hibernate.hbm2ddl.auto

    create 将在创建sessionFactory时创建表,并保持原样不变 .

    create-drop 将创建表,然后在关闭sessionFactory时删除它们 .

    也许你应该明确地设置javax.persistence.Table注释?

    希望这可以帮助 .

  • 0

    您可以尝试在persistence.xml中更改此行

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

    至:

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

    这应该保持架构以遵循每次运行应用程序时对模型所做的任何更改 .

    来自JavaRanch

  • -4

    有时,取决于配置的设置方式,属性标签的长格式和短格式也会产生差异 .

    例如如果你喜欢它:

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

    尝试将其更改为:

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

    在我的情况下,表没有首次创建,没有下面列出的最后一个属性:

    <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数据库

  • 1

    有一个非常重要的细节,可能会阻止你的休眠生成表(假设你已经设置了 hibernate.hbm2ddl.auto ) . 您还需要 @Table 注释!

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

    它已经在我的案例中至少帮助了3次 - 仍然记不清楚;)

    PS . 阅读hibernate文档 - 在大多数情况下,您可能不希望将 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>
    
  • 8

    Hibernate hbm2ddl.auto

    创建SessionFactory时,自动验证或将架构DDL导出到数据库 . 使用create-drop,当SessionFactory显式关闭时,将删除数据库模式 . 例如验证|更新|创建|创建降

    请查看link了解更多详情 .

相关问题