Hibernate: crear / actualizar automáticamente las tablas de base de datos basadas en clases de entidad

101

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

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 actualice automáticamente las tablas en función de las clases de entidad. ¿Cómo lograría esto?

Jason Miesionczek
fuente

Respuestas:

104

No sé si dejar hibernateel frente marca la diferencia.

La referencia sugiere que debería serhibernate.hbm2ddl.auto

Un valor de createcreará sus tablas en la creación de sessionFactory y las dejará intactas.

Un valor de create-dropcreará sus tablas y luego las eliminará cuando cierre sessionFactory.

¿Quizás debería establecer la javax.persistence.Tableanotación explícitamente?

Espero que esto ayude.

caja de herramientas
fuente
12
Era la 'hibernación' que faltaba al comienzo de hbm2dll.auto. ¡Gracias!
Jason Miesionczek
Acabo de eliminar esa línea y no dejará caer la mesa. ¡Espero que esto ayude!
Meinkraft
1
¿Cómo puedo hacer hibernar para crear tablas solo si no existen?
Aman Nagarkoti
81

Puede intentar cambiar esta línea en su persistence.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 ejecuta la aplicación.

Obtuve esto de JavaRanch

billjamesdev
fuente
10

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 tiene como:

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

intente cambiarlo a:

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

En mi caso, la tabla no se creó por primera vez sin la última propiedad que se enumera 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>

utilizó la base de datos H2 en memoria de Wildfly

DevDio
fuente
2

Hay un detalle muy importante, que posiblemente puede evitar que su hibernación genere tablas (asumiendo que ya ha configurado hibernate.hbm2ddl.auto). ¡También necesitará la @Tableanotación!

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

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

PD. Lea la documentación de Hibernate - en la mayoría de los casos Es probable que no tendrá que ajustar hibernate.hbm2ddl.autoa create-drop, ya que elimina Sus tablas después de detener la aplicación.

Thorinkor
fuente
0

En el archivo 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>
Yusuf Aksun
fuente
0

En apoyo a la respuesta de @ thorinkor, ampliaría mi respuesta para usar no solo la anotación @Table (name = "table_name") para la entidad, sino que también cada variable secundaria de la clase de entidad debe anotarse con @Column (name = "col_name"). Esto se traduce en una actualización perfecta de la mesa sobre la marcha.

Para aquellos que buscan una configuración de hibernación basada en clases Java, la regla también se aplica en configuraciones basadas en Java (NewHibernateUtil). Espero que ayude a alguien más.

AbsoluteDev
fuente