105 votes

Hibernate : Création/mise à jour automatique des tables de la BD en fonction des classes d'entités

J'ai la classe d'entité suivante (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

}

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

et le script :

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 données Icarus existe, mais ne comporte actuellement aucune table. Je voudrais qu'Hibernate crée et/ou mette à jour automatiquement les tables en fonction des classes d'entités. Comment puis-je réaliser cela ?

0voto

Yusuf Aksun Points 1

Dans le fichier 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>

0voto

AbsoluteDev Points 155

En soutien à la réponse de @thorinkor, je voudrais étendre ma réponse pour utiliser non seulement l'annotation @Table (nom = "nom_table") pour l'entité, mais aussi chaque variable enfant de la classe d'entité devrait être annotée avec @Column(nom = "nom_col"). Cela permet une mise à jour transparente de la table en cours de route.

Pour ceux qui recherchent une configuration d'Hibernate basée sur une classe Java, la règle s'applique également aux configurations basées sur Java (NewHibernateUtil). J'espère que cela aidera quelqu'un d'autre.

0voto

Rizwan Ali Points 21
  1. À LA CRÉATION AUTOMATIQUE DE TABLEAU, PAS DE CONNEXION AVEC LES ANNOTATIONS
  2. Pour cela, nous devons modifier "hibernate.cfg.xml" comme suit.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X