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.