usadas relacional provienen para paquete mapeo mapear las entidades ejemplo con anotaciones java mysql hibernate jpa groovy

relacional - mapeo en java



Hibernate: Creación/actualización automática de tablas db basadas en clases de entidad (7)

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.

por ejemplo, si lo tiene como:

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

intente cambiarlo a:

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

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

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 cree y / o actualice automáticamente las tablas basadas en las clases de entidad. ¿Cómo podría lograr esto?


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>


En mi caso, la tabla no se creó por primera vez sin la última propiedad enumerada 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 en memoria H2 de Wildfly


Hay un detalle muy importante que puede posiblemente evitar que su hibernación genere tablas (suponiendo que ya ha configurado 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 puedo recordarlo;)

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


No sé si dejar la hibernate en el frente hace la diferencia.

La reference sugiere que debe 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 debería establecer la anotación javax.persistence.Table explícitamente?

Espero que esto ayude.


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 debe mantener el esquema para seguir cualquier cambio que realice en el Modelo cada vez que ejecute la aplicación.

Tengo esto de JavaRanch


Hibernate hbm2ddl.auto :

Automáticamente valida o exporta el esquema DDL a la base de datos cuando se crea SessionFactory. Con create-drop, el esquema de la base de datos se eliminará cuando SessionFactory se cierre explícitamente. por ejemplo, validar | actualización | crear | crear-soltar

Por favor, consulte el link para más detalles.