2011-12-27 12 views
5

Ho un database mysql che voglio aggiungere la funzionalità di aggiungere una nuova tabella al database. Probabilmente potrei trovare facilmente l'esempio di JPQL per questo, ma come potrei quindi generare automaticamente l'entità per questa nuova tabella in modo che potessi farvi riferimento nel resto del mio codice JPA per l'aggiornamento e l'eliminazione dalla tabella di solito riferimento all'entità non il vero tavolo stesso.Java EE/JPA come aggiungere nuove tabelle/entità al database

Le entità che ho ora ho usato eclipe per generare dalle tabelle che ho creato. Ma dopo la distribuzione ovviamente non avremo Eclipse per farlo, quindi lo faremo automaticamente ogni volta che viene creata una tabella.

risposta

7

Creare e mappare dinamicamente nuove tabelle non è qualcosa che supporta JPA. Avrebbe bisogno di creare nuove classi Java al volo e aggiornare dinamicamente i metadati di mappatura. Puoi fare tutto ciò che vuoi con JDBC o query native. Ma forse dovresti spiegare perché è necessario creare nuovi tavoli al volo.

+0

Non so che avrò bisogno di creare tabelle molto spesso. Penso che se crei correttamente il tuo schema dovresti creare nuove tabelle. Ma se lo facessimo, potrei sempre fare in modo che il progetto del server venga ricostruito e distribuito con i nuovi mapping. Volevo solo sapere se era possibile perché qualcuno mi chiedeva se potevo farlo. – Randnum

+0

Per aggiungere una nuova mappatura, dovrai effettivamente ridistribuire una nuova versione della tua applicazione. Probabilmente dovrai anche eseguire uno script di migrazione dello schema, perché ci sono buone probabilità che questa nuova tabella abbia effetto su quelle esistenti (nuove chiavi esterne, modifiche alla progettazione, ecc.). Assicurati di testare l'intera procedura prima di farlo sul tuo server di produzione per assicurarti che i tempi di inattività siano il più brevi possibile. –

+0

Buon punto. Anche se penso almeno alla domanda che mi è stata presentata, queste tabelle sarebbero indipendenti dalle altre tabelle senza relazioni e chiavi.Ma per generare le entità che dovrei ridistribuire, sarebbe ancora una cattiva idea. – Randnum

1

è possibile configurare le proprietà di ibernazione o persistence.xml per aggiornare db all'avvio del server. renderà automaticamente gli aggiornamenti delle tabelle. guarda accanto al parametro hibernateDialect.

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

è quello che vuoi. Non penso che vogliate creare classi di entità al volo e volere che le tabelle vengano create senza ridistribuire come dice @JB Nizet nella sua risposta.

3

Ci sono un paio di modi per creare le tabelle. Il più comune per l'utilizzo di produzione è che il DBA (o sviluppatore in quel ruolo) crea lo schema del database (tabelle, ecc.) Indipendentemente dall'applicazione.

Questo è tipico, poiché l'applicazione modella i dati nel database e c'è una saggezza comune che dice che il database normalmente sopravvive all'applicazione.

È possibile consentire al provider JPA di creare automaticamente lo schema. Esistono anche un paio di attributi nelle annotazioni JPA specificamente per questo scopo (ad esempio l'attributo nullableJoinColumn).

L'attivazione di ciò avviene con proprietà specifiche del provider in persistence.xml. Per esempio. hibernate.hbm2ddl.auto per Hibernate (come utilizzato in JBoss AS) e eclipselink.ddl-generation per EclipseLink (come utilizzato in GlassFish).

Vedere http://wiki.eclipse.org/EclipseLink/Examples/JPA/Migration/JBoss per alcuni esempi.

L'inserimento di un'entità in una tabella è una cosa completamente diversa. Dalla tua domanda in qualche modo hai la sensazione che potresti non comprendere appieno la differenza tra quei due. Succede per es. EntityManager#persist, ma non sono sicuro al 100% se questo è ciò che stai chiedendo.

Problemi correlati