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 ?

106voto

toolkit Points 27248

Je ne sais pas si partir hibernate de l'avant fait une différence.

El référence suggère qu'il devrait être hibernate.hbm2ddl.auto

Une valeur de create créera vos tables à la création de sessionFactory, et les laissera intactes.

Une valeur de create-drop créera vos tables, puis les abandonnera lorsque vous fermerez la sessionFactory.

Vous devriez peut-être définir le javax.persistence.Table explicitement ?

J'espère que cela vous aidera.

12 votes

Il manquait le mot 'hibernate' au début du fichier hbm2dll.auto. Merci !

0 votes

Je viens d'enlever cette ligne et la table ne tombe pas. J'espère que cela vous aidera !

1 votes

Comment puis-je faire en sorte qu'Hibernate ne crée des tables que si elles n'existent pas ?

83voto

Bill James Points 7554

Vous pouvez essayer de modifier cette ligne dans votre persistence.xml de la manière suivante

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

à :

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

Ceci est censé maintenir le schéma pour qu'il suive toutes les modifications apportées au modèle à chaque fois que vous exécutez l'application.

J'ai trouvé ça dans JavaRanch

10voto

Harbir Points 132

Parfois, selon la façon dont la configuration est définie, la forme longue et la forme courte de la balise de propriété peuvent également faire la différence.

Par exemple, si vous l'avez comme :

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

essayez de le changer en :

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

7voto

DevDio Points 854

Dans mon cas, la table n'a pas été créée pour la première fois sans la dernière propriété listée ci-dessous :

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

a utilisé la base de données H2 en mémoire de Wildfly.

2voto

thorinkor Points 195

Il y a un détail très important, qui peut éventuellement empêcher votre hibernate de générer des tables (en supposant que vous avez déjà défini l'attribut hibernate.hbm2ddl.auto ). Vous aurez également besoin du @Table annotation !

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

Il m'a déjà aidé dans mon cas au moins 3 fois - je ne m'en souviens toujours pas ;)

PS. Lisez la documentation d'Hibernate - dans la plupart des cas, vous ne voudrez probablement pas paramétrer hibernate.hbm2ddl.auto à create-drop car il supprime vos tableaux après avoir arrêté l'application.

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