2010-01-12 13 views
23

Ho esaminato brevemente JPA di recente e mi chiedevo quale fosse l'accordo con le migrazioni dello schema del database e rimanessi allineato con le classi che hai creato.Supporto per migrazioni di schemi con JPA?

C'è supporto in JPA per questo materiale? Utilità? Migliori pratiche?

Cheers!

+1

Ho letto di recente il libro sull'APP. Il JPA 2.1 è stato rilasciato nel 2013, supporta ora le migrazioni? – AechoLiu

risposta

0

Se si imposta la sospensione generateDdl (se si tratta dell'implementazione sottostante), viene generato lo schema del database in base al proprio dialetto corrente. Quindi, dopo aver cambiato il dialetto, genererà automaticamente il database.

Altri provider JPA possono avere proprietà diverse per questo.

+1

Questo è corretto, ma non affronta il problema della migrazione dello schema. – HDave

+0

@HDave - al contrario. Lo schema viene replicato nel nuovo database, rispecchiando il modello di dati corrente. – Bozho

+4

Con la migrazione dello schema, credo che l'OP significhi avere degli script che possono prendere un database esistente con i dati e aggiornarlo con le nuove entità/schema. Spesso questo comporta un attento studio delle modifiche dello schema e talvolta lo scarico/ricaricamento dei dati in modo che gli FK possano essere modificati, i PK possono essere divisi, ecc. Hibernate può generare uno script per creare un nuovo schema. Hibernate può anche generare uno script per modificare un vecchio schema per renderlo un nuovo schema, ma presuppone che il database non abbia dati - e anche allora la mia comprensione è che la capacità è usata raramente a causa di "problemi". – HDave

6

La risposta breve è no.

Se si cambiano i bean, sarà necessario migrare manualmente lo schema esistente. Quindi, per le migrazioni del database in stile Rails, dovrai cercare altrove.

Tuttavia è possibile generare l'iniziale ddl dai bean Java facilmente. L'esempio che segue illustra la creazione di schema con EclipseLink versione 2.0:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
    <persistence-unit name="JPATestPU" transaction-type="RESOURCE_LOCAL"> 
     <provider> 
      org.eclipse.persistence.jpa.PersistenceProvider 
     </provider> 
     <class>org.randompage.MyEntity</class> 
     <properties> 
      <property name="javax.persistence.jdbc.user" value="johndoe"/> 
      <property name="javax.persistence.jdbc.password" value="secret"/> 
      <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/> 
      <property name="javax.persistence.jdbc.url" value="jdbc:h2:~/.h2/testdb;FILE_LOCK=NO"/> 
      <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/> 
      <property name="eclipselink.logging.level" value="INFO"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

L'elemento chiave qui è

<property name="eclipselink.ddl-generation" value="drop-and-create-tables"/> 

Questo dice EclipseLink a cadere tabelle esistenti e generare nuovo una volta dal mappatura JPA. Questa procedura è altamente specifica del fornitore, quindi per altri fornitori JPA (Hibernate, OpenJPA ...) sarà necessario consultare la documentazione specifica.

11

Non mi affido ai provider JPA per aggiornare lo schema del database. Verifica Liquibase per uno dei buoni approcci.