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?
risposta
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
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!
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. –
Vedere i miei aggiornamenti sopra se aiuta! – Shailendra
Ho aggiunto un collegamento nella sezione "AGGIORNAMENTO 2" che sembra fare ciò che si vuole fare! – Shailendra
- 1. ibernazione - ottiene l'id dopo l'oggetto di salvataggio
- 2. Aggiungi dipendenza al modulo Angolare dopo che è stato creato
- 3. Come è stato creato Google.com?
- 4. Come verificare se un assembly è stato creato utilizzando la configurazione di debug o release?
- 5. java.lang.IllegalArgumentException: No PersistenceProvider specificata nella configurazione EntityManagerFactory
- 6. Come modificare l'intervallo di tempo dopo che Observable.timer è stato creato?
- 7. Configurazione di ibernazione sia nel file che nel codice
- 8. Come si ottiene la dimensione di UIImageView dopo l'applicazione dell'autolayout?
- 9. Come si ottiene lo stato della stampante?
- 10. Come posso modificare le opzioni del widget UI jQuery dopo che è stato creato?
- 11. Configurazione di ibernazione in runtime
- 12. Come posso aggiungere utenti al builder inMemoryAuthentication dopo che è stato creato?
- 13. È possibile modificare un trigger mysql esistente dopo che è stato creato?
- 14. Passaggio di un valore dall'attività al thread dopo che il thread è già stato creato
- 15. Quando è stato creato Batch?
- 16. Cambia Maven Archetype dopo che un progetto è stato creato in eclissi?
- 17. In Swift 2.1, come si ottiene il NSError che è stato lanciato?
- 18. elimina tag CVS che è stato creato in precedenza
- 19. C'è un modo con Apache Ant per aggiornare un file jar dopo che è stato creato?
- 20. Come utilizzare i framework di gioco Modulo protetto per accedere a un utente dopo che l'utente è stato creato
- 21. integrazione di primavera + ibernazione manca "table_name"
- 22. Come determinare come è stato creato un assemblaggio
- 23. VB6 è stato creato su .NET WinForm?
- 24. configurazione barra di stato tmux
- 25. Come rilevare l'indirizzo MAC originale dopo che è stato falsificato?
- 26. Come, usando l'iniezione di dipendenza, si ottiene la configurazione da più fonti?
- 27. Come ottenere la larghezza corretta di un UILabel dopo che il testo è stato impostato?
- 28. La barra di stato di IOS7 diventa nera dopo che la ricerca è attiva
- 29. In Ninject, come posso eseguire codice personalizzato su un oggetto dopo che è stato creato con Bind <..> .ToSelf()?
- 30. Come si ottiene un nuovo token di accesso dopo la scadenza senza una ricarica della pagina?
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