2013-05-22 19 views
11

Al momento disponiamo di un sistema Java EE in cui mappiamo il nostro database utilizzando JPA. È un sistema abbastanza ben sviluppato con circa 20 entità.JPA e visualizzazioni tabella. Può essere fatto?

Ora ci è stato ordinato di utilizzare Views per tutto. Ad es .: se abbiamo un tavolo chiamato PERMISSION allora abbiamo anche bisogno di una vista chiamata PERMISSION_VIEW. Fondamentalmente abbiamo bisogno di fare questo a ogni tabella, e le nostre applicazioni possono accedere ai dati solo interrogando la vista.

Ora tutti i nostri bean di entità simile a questa:

@Entity 
@Table(name = "PERMISSION") 
@NamedQueries({ 
     @NamedQuery(name = "Permission.findByPK", query = "SELECT p FROM Permission p WHERE p.dpNum = :dpNumber"), 
     @NamedQuery(name = "Permission.deleteAll", query = "DELETE FROM Permission") }) 
public class Permission implements Serializable { 

} 
  • In primo luogo, come è possibile aggiornare le tabelle se si è solo permesso di utilizzare Visualizzazioni. Le viste materializzate possono funzionare per questo?
  • In secondo luogo, quanta riscrittura sarà necessaria, se possiamo usare solo Views? Per esempio. Per ogni entità sarà necessario scrivere @Table (name = "PERMISSION_VIEW"), per descrivere l'entità, MA, quando si fa un aggiornamento è necessario farlo nella tabella PERMISSION. Come mai consolidi questo in un bean di entità?
+0

scusate la domanda perplessa per favore, ma perché qualcuno dovrebbe voler fare questo? – kostja

+1

Io lavoro in una grande organizzazione, e abbiamo alcune linee guida del database scritte da qualcuno da qualche parte che dice che ci viene richiesto di usare le viste, per motivi di sicurezza e di gestione. –

+2

L'applicazione necessita chiaramente dell'accesso in scrittura al database. Non vedo quale sicurezza o altro vantaggio avvenga se le tue visualizzazioni contengono gli stessi dati delle tue tabelle. –

risposta

5

La maggior parte dei moderni RDBMS supporta visualizzazioni inseribili e aggiornabili. Se il tuo RDBMS lo supporta, non dovresti avere alcun problema. Una vista identica a una tabella deve essere aggiornabile in qualsiasi RDBMS che supporta tali viste. Quindi è sufficiente modificare la mappatura e sostituire i nomi delle tabelle con i nomi delle viste.

+0

fino a quando l'implementazione JPA supporta anche le viste (che alcuni fanno, DataNucleus JPA lo fa certamente) – DataNucleus

+2

Tutte le implementazioni JPA che conosco sono basate su JDBC. Le istruzioni SQL saranno le stesse (inserire in T ...) indipendentemente se T è una tabella o una vista. Questo è il motivo per cui penso che dipenda solo da RDBMS per supportare una vista aggiornabile, mentre l'implementazione JPA non ha bisogno di saperlo. A meno che non manchi qualcosa. – nakosspy

11

Per ulteriori informazioni sulle viste JPA e database vedere, http://en.wikibooks.org/wiki/Java_Persistence/Advanced_Topics#Views

In JPA è possibile mappare a un VIEW lo stesso di un tavolo, usando l'annotazione @Table. È quindi possibile mappare ogni colonna nella vista agli attributi dell'oggetto. Le viste sono in genere di sola lettura, quindi la mappatura dell'oggetto alle viste normalmente è anche di sola lettura. Nella maggior parte dei database, le viste possono anche essere aggiornabili a seconda della complessità della query che incapsulano. Anche per query complesse, i trigger di database possono essere normalmente utilizzati per l'aggiornamento nella vista.

Problemi correlati