web-dev-qa-db-fra.com

Hibernate: création / mise à jour automatique des tables de base de données en fonction des classes d'entité

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 n'a actuellement aucune table. J'aimerais qu'Hibernate crée et/ou mette à jour automatiquement les tables en fonction des classes d'entité. Comment pourrais-je accomplir ceci?

95
Jason Miesionczek

Je ne sais pas si laisser hibernate à l'avant fait une différence.

Le référence suggère que ce devrait être _hibernate.hbm2ddl.auto_

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

Une valeur de _create-drop_ créera vos tables, puis les supprimera à la fermeture de la sessionFactory.

Peut-être devriez-vous définir explicitement l'annotation javax.persistence.Table ?

J'espère que cela t'aides.

97
toolkit

Vous pouvez essayer de changer cette ligne dans votre persistence.xml à partir de

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

à:

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

Ceci est supposé maintenir le schéma pour suivre toutes les modifications que vous apportez au modèle chaque fois que vous exécutez l'application.

Je l'ai obtenu de JavaRanch

75
billjamesdev

Parfois, en fonction de la configuration de la configuration, 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 pour:

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

Dans mon cas, la table n'a pas été créée pour la première fois sans la dernière propriété répertorié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>

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

1
DevDio

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

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

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

PS Lisez les documents d'hibernation - dans la plupart des cas, vous ne voudrez probablement pas définir hibernate.hbm2ddl.auto sur create-drop, car il supprime vos tables après avoir arrêté l'application.

0
thorinkor

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>
0
Yusuf Aksun