JPA / Hibernate: création d'un schéma de base de données et importation de données lors de la première exécution, mise à jour du schéma lors des éditions suivantes

dans mes projets j'utilise souvent la pile JPA/Hibernate pour la base de données.

lors de la définition de persistence.xml vous avez des options de couple que vous pouvez définir hibernate.hbm2ddl.auto . Si défini à create les tables seront recréées sur chaque exécution d'application (données persistées seront perdues bien sûr). Il est également possible d'importer des données initiales en réglant le fixage db avec hibernate.hbm2ddl.import_files . Lorsque update seules les tables pour les nouvelles entités seront créés (données persistantes dans des tables existantes seront préserver.)

la chose est que ce n'est pas si commode tout en développant et je voudrais un comportement comme celui-ci:

  • lors du premier lancement de l'application (quand il n'y a pas de tables dans la base de données) - agir comme hibernate.hbm2ddl.auto est défini à create (créer des tables basées sur des entités) et importer des Fixtures de base de données prédéfinies
  • sur tous les passages suivants-agir comme hibernate.hbm2ddl.auto est défini à update (créer de nouvelles tables pour les nouveaux entités, laissez tables de données pour les anciennes entités).

est-ce possible d'implémenter quelque chose comme ça?

plus d'informations sur ma pile typique: application Web de printemps, courant sur Tomacat, base de données est MySql, JPA/Hibernate pour l'accès à la base de données.

Mon type persistence.xml :

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
            <!-- value="create" to build a new database on each run; value="update" to modify an existing database; value="create-drop" means the same as "create" but also drops tables when Hibernate closes; value="validate" makes no changes to the database -->
            <property name="hibernate.hbm2ddl.auto" value="update"/>
            <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/>
            <property name="hibernate.connection.charSet" value="UTF-8"/>
            <property name="hibernate.hbm2ddl.import_files" value="/META-INF/spring/import.sql"/>
        </properties>
    </persistence-unit>
</persistence>

n'hésitez pas à commenter si vous avez besoin d'autres infos sur ma configuration de l'application ou de la structure.

2
demandé sur Eugene Loy 2013-10-24 10:59:41

3 réponses

s'il vous Plaît gardez à l'esprit que l'utilisation de hbm2ddl.auto vous ne pouvez mettre à jour la structure de la base de données, pas de valeurs.

Par exemple: disons que vous avez

@Version
private Long version;

après un certain temps, vous découvrez que vous préféreriez avoir

@Version
@Temporal(TemporalType.TIMESTAMP)
private Date lastModified;

Hibernate n'a pas beaucoup d'indices sur le changement de signification sémantique et ne saurait certainement pas comment convertir le champ en conséquence ou par défaut à définir.

"151990920 Des" propriétés hbm2ddl.auto et hbm2ddl.import_files sont pratiques pour courte durée (en mémoire) bases de données (et donc pour automatiser l'intégration ou de tests d'acceptation), mais sont tout simplement pas adapté pour les environnements de production.

je fortement suggère quelque chose comme scriptella ou liquibase . J'utilise personnellement le dernier. Nathan fait un excellent travail sur l'outil, la documentation manque un peu de détails.

Qui dit:

-Dhibernate.hbm2ddl.auto=create -Dhibernate.hbm2ddl.import_files=foo.sql

lors du premier démarrage de votre application devrait faire l'affaire. Il suffit de définir la valeur de hbm2ddl.auto à update dans votre persistence.xml .

3
répondu Markus W Mahlberg 2014-03-22 00:47:22

il suffit d'utiliser update -- si la base de données est vide alors le résultat pour update et create est le même.

1
répondu Ralph 2013-10-24 08:31:44

j'ai eu le même problème et je n'ai pas trouvé de solutions D'hibernation/JPA. Ne pas Hiberner solution une option pour vous? Je peux vous suggérer d'utiliser liquibase . Vous pouvez définir quelques SQL initiaux et ensuite liquibase exécutera leur au démarrage. Il a un pluggin maven, donc vous pouvez le configurer dans votre pom et ensuite l'utiliser avec maven.

1
répondu mvb13 2013-10-24 11:00:41