Hibernate: Crear/actualizar automáticamente las tablas de bd basadas en clases de entidad


Tengo la siguiente clase de entidad (en 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

}

Y mi persistencia.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>

Y el guión:

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()

La base de datos Icarus existe, pero actualmente no tiene tablas. Me gustaría que Hibernate creara y/o actualizara automáticamente las tablas basadas en las clases de entidad. ¿Cómo lograría esto?

Author: Opal, 2008-11-20

7 answers

No se si dejar hibernate fuera del frente hace una diferencia.

La referencia sugiere que debería ser hibernate.hbm2ddl.auto

Un valor de create creará sus tablas en la creación de SessionFactory, y las dejará intactas.

Un valor de create-drop creará sus tablas y luego las soltará cuando cierre SessionFactory.

Tal vez usted debe establecer la javax.persistence.Table ¿anotación explícitamente?

Espero que esto ayude.

 92
Author: toolkit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-01 07:58:10

Puede intentar cambiar esta línea en su persistencia.xml de

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

A:

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

Se supone que esto mantiene el esquema para seguir cualquier cambio que realice en el Modelo cada vez que ejecute la aplicación.

Obtuve esto de JavaRanch

 73
Author: billjamesdev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-14 02:48:48

A veces, dependiendo de cómo se establezca la configuración, la forma larga y la forma corta de la etiqueta de propiedad también pueden marcar la diferencia.

Por ejemplo, si lo tienes como:

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

Intenta cambiarlo a:

<property name="hibernate.hbm2ddl.auto">create</property>
 8
Author: Harbir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-29 23:28:06

En mi caso la tabla no fue creada por primera vez sin la última propiedad listada a continuación:

<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>

Se utilizó la base de datos H2 en memoria de Wildfly

 1
Author: DevDio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-10 17:02:12

Hay un detalle muy importante, que posiblemente puede detener su hibernación de generar tablas (suponiendo que ya ha establecido el hibernate.hbm2ddl.auto). También necesitará la anotación @Table!

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

Ya ha ayudado en mi caso al menos 3 veces-todavía no puedo recordarlo;)

PS. Lea los documentos de hibernación-en la mayoría de los casos, probablemente no desee establecer hibernate.hbm2ddl.auto a create-drop, porque elimina Sus tablas después de detener la aplicación.

 0
Author: thorinkor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-19 13:44:57

En ApplicationContext.archivo 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
Author: Yusuf Aksun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-15 06:17:15

Hibernate hbm2ddl.auto :

Valida o exporta automáticamente el esquema DDL a la base de datos cuando se crea SessionFactory. Con create-drop, el esquema de base de datos se eliminará cuando la SessionFactory se cierre explícitamente. por ejemplo, validate | update | create / create-drop

Por favor revise el enlace para más detalles.

 -4
Author: user2530633,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-25 17:00:51