2008-11-20 13 views
85

tengo la siguiente clase de entidad (en Groovy):Hibernate: crear automáticamente/actualización de las tablas de base de datos basado en clases de entidad

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

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

Respuesta

87

No sé si se sale de la parte frontal hibernate hace la diferencia.

El reference sugiere que debería ser hibernate.hbm2ddl.auto

Un valor de create creará sus mesas en la creación sessionFactory, y dejarlos intactos.

Un valor de create-drop creará sus tablas, y luego las dejará caer cuando cierre el sessionFactory.

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

Espero que esto ayude.

+9

Era el 'hibernate' faltante al comienzo de hbm2dll.auto. ¡Gracias! –

+0

Acabo de eliminar esa línea y no se caerá la mesa. ¡Espero que esto ayude! – Meinkraft

+0

¿cómo puedo hacer hibernar para crear tablas solo si no existieron? –

72

Usted puede tratar de cambiar esta línea en su persistence.xml de

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

a:

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

Esto se supone para mantener el esquema a seguir cualquier cambio que realice en el modelo cada vez usted ejecuta la aplicación.

Tienes esto desde JavaRanch

8

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

p. Ej. si lo tiene gusto:

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

pruebe a cambiar a:

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

Hibernate hbm2ddl.auto:

valida automáticamente o DDL exportaciones esquema para la base de datos cuando se crea la SessionFactory . Con create-drop, el esquema de la base de datos se eliminará cuando SessionFactory se cierre explícitamente. p. validar | actualización | crear | crear-soltar

Compruebe el link para más detalles.

+1

este enlace está desactualizado/roto –

0

Hay un detalle muy importante, que posiblemente puede detener su hibernación generar tablas (suponiendo que ya ha configurado el hibernate.hbm2ddl.auto).¡También necesitarás 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 puede recordarlo;)

PS. Lea los documentos de hibernación: en la mayoría de los casos, probablemente no desee establecer hibernate.hbm2ddl.auto en create-drop, ya que borrará sus tablas después de detener la aplicación.

0

En applicationContext.xml archivo:

<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

En mi tabla de casos no fue creado por primera vez sin la última propiedad enumeran 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> 

utilizado la base de datos de H2 en memoria de JBoss

Cuestiones relacionadas