休眠:根据实体类自动创建/更新数据库表


101

我有以下实体类(在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基于实体类自动创建和/或更新表。我将如何完成?

Answers:


104

我不知道离开hibernate前线是否会有所作为。

参考表明,它应该是hibernate.hbm2ddl.auto

值为create会在sessionFactory创建时创建表,并保持它们不变。

值为create-drop会创建您的表,然后在关闭sessionFactory时将其删除。

也许您应该javax.persistence.Table显式设置注释?

希望这可以帮助。


12
它是hbm2dll.auto开头缺少的“休眠”。谢谢!
杰森·米森西奇克

我只是删除了那条线,它不会放下桌子。希望这可以帮助!
Meinkraft

1
如何使休眠状态仅在表不存在时才创建?
阿曼·纳加科蒂

81

您可以尝试从以下位置更改persistence.xml中的这一行:

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

至:

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

这样做是为了保持架构,使其在每次运行应用程序时都遵循您对模型所做的任何更改。

JavaRanch得到了这个


10

有时,取决于配置的设置方式,属性标记的长格式和短格式也可能有所不同。

例如,如果您有这样的话:

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

尝试将其更改为:

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

6

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

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


2

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

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

就我而言,它已经帮助了至少3次-仍然不记得了;)

PS。阅读休眠文档-在大多数情况下,您可能不希望将其设置hibernate.hbm2ddl.autocreate-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

为了支持@thorinkor的答案,我将扩展答案,不仅为实体使用@Table(name =“ table_name”)注释,而且实体类的每个子变量都应使用@Column(name =“ col_name”)进行注释。这样就可以随时随地无缝更新表。

对于那些正在寻找基于Java类的hibernate配置的人,该规则也适用于基于Java的配置(NewHibernateUtil)。希望它可以帮助其他人。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.