2012-09-07 13 views
6

Il mio framework web (Riproduci 1.2.5) crea un EJB3Configuration locale per un metodo che utilizza per creare un EntityManagerFactory(source). Sto lavorando su uno script e vorrei eseguire il metodo generateSchemaUpdateScript() dalla configurazione per creare script SQL che posso verificare ed eseguire sui deployment di produzione. Il problema che sto avendo è che non riesco a capire come accedere all'oggetto Configuration che è stato utilizzato o come generare un oggetto Configuration dopo che è stato creato il EntityManagerFactory.Come si ottiene la configurazione di ibernazione dopo che EntityManagerFactory è stato creato?

+0

Suggerirei di parlare con il DBA su qualsiasi strumento di schema disponibile. Potrebbero essere in grado di copiare lo schema per te o fornire lo script. – MarkOfHall

risposta

7

Non è possibile ottenere l'oggetto di configurazione di ritorno dal EntityManagerFactory perché implementazione di ibernazione EntityManagerFactoryImpl non detiene un riferimento all'oggetto di configurazione

Le scelte sono

  • duplica il codice dal JPAPlugin nello script per creare il tuo oggetto di configurazione
  • configura gli strumenti di ibernazione per lavorare sulle tue classi. Non ho mai usato questo strumento me stesso, ma penso che correttamente configurato può generare il DDL per voi
  • genera di nuovo lo script DDL dal database
2

Una volta che il direttore della fabbrica Entity è stata creata non si suppone di avere l'handle per l'oggetto Configuration, in parte a causa del design che si suppone che la configurazione esibisca comportamento immutabile in quanto non è possibile modificare le sue proprietà.

mi riferisco a Hibernate 3.6.8 fonte e la classe EJB3Configuration ha metodo

public AnnotationConfiguration getHibernateConfiguration() { 
     //TODO make it really read only (maybe through proxying) 
     return cfg; 
    } 

AnnotationConfiguration è dichiarato come deprecato come tutta la sua funzionalità viene spostato alla classe di configurazione.

Quindi penso che l'utilizzo di questo è possibile ottenere l'handle per la configurazione una volta che è stato creato. Devi essere molto attento però a non cambiare nulla in quella configurazione.

questo è spiegato nelle javadocs here

Dopo #buildEntityManagerFactory() è stato chiamato, non è più possibile cambiare lo stato di configurazione (nessuna classe aggiunta, nessun cambiamento di proprietà ecc)

Detto questo, quello che stai cercando di ottenere è qualcosa che è STRETTAMENTE NON CONSIGLIATO soprattutto sul database di produzione. Vedi here

Hibernate ha una proprietà denominata "hibernate.hbm2ddl.auto" che serve per assistere la generazione automatica dello schema in caso di script in evoluzione. Quello che stai cercando di ottenere a livello di programmazione ha lo stesso effetto assegnandogli un valore di aggiornamento come di seguito nel tuo xml di persistenza. Infatti sotto le copertine, il metodo generateSchemaUpdateScript viene chiamato dalla configurazione quando si ha il valore di "hibernate.hbm2ddl".auto" impostato su 'update'

<persistence 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" 
      version="2.0"> 
    <persistence-unit name="xyz" transaction-type="RESOURCE_LOCAL"> 
     <properties> 
      .................... 
      <property name="hibernate.hbm2ddl.auto" value="update"/> 
      ...................... 
     </properties> 
    </persistence-unit> 
</persistence> 

È possibile fare riferimento ad altri valori possibili per questo attributo here

Tuttavia la documentazione Hibernate fornisce consulenza stricltly contro l'uso di questo contro database di produzione.

Il libro definitivo su Hibernate "la persistenza Java con Hibernate", avverte questa

ATTENZIONE Abbiamo visto Hi Gli utenti di bernate che tentano di utilizzare SchemaUpdate per aggiornano automaticamente lo schema di un database di produzione. Questo può terminare rapidamente in caso di emergenza e non sarà consentito dal tuo DBA.

ed anche alcune limitazioni sul processo schema di aggiornamento

Un'ulteriore opzione per questa proprietà di configurazione, aggiornamento, può essere utile durante lo sviluppo: essa consente lo strumento SchemaUpdate incorporato, che può rendere l'evoluzione dello schema più facile. Se abilitato, Hibernate legge i metadati del database JDBC all'avvio e crea nuove tabelle e vincoli confrontando il vecchio schema con i metadati di mappatura correnti . Si noti che questa funzionalità dipende dalla qualità dei metadati forniti dal driver JDBC, un'area in cui mancano molti driver . In pratica, questa funzione è quindi meno eccitante e utile di quanto suona.

UPDATE 1: Se non si ha accesso al EJB3Configuration e il vostro obiettivo finale è quello di creare gli script dello schema di aggiornamento per le entità JPA annotata quindi è possibile a livello di codice creare l'EJB3Configuration in una classe principale Java utilizzando una persistenza file xml che contiene i dettagli di configurazione del database ed esegue lo strumento di esportazione dello schema. Vedi l'esempio this come puoi farlo. In questo modo è possibile eseguire lo strumento su entità JPA al di fuori del framework o persino del contenitore.

UPDATE 2

Il codice di esempio elencato here mostra come è possibile utilizzare aggiornamento dello schema di sospensione durante la creazione di migrazioni di database per le applicazioni di gioco. Sembra che questo è quello che volevi!

+1

Per motivi fuori dal mio controllo, non ho accesso all'istanza EJB3Configuration, quindi non posso accedere alla configurazione da questo. Sono d'accordo con il tuo consiglio in più, il mio piano attuale era quello di eseguire generateSchemaUpdateScript() sul mio database di sviluppo e controllare l'aggiornamento sql e lasciare che il mio DBA esegua quello dopo averlo verificato. –

+0

Vedere i miei aggiornamenti sopra se aiuta! – Shailendra

+0

Ho aggiunto un collegamento nella sezione "AGGIORNAMENTO 2" che sembra fare ciò che si vuole fare! – Shailendra

Problemi correlati