2013-05-22 3 views
11

Wir haben derzeit ein Java EE-System, in dem wir mithilfe von JPA auf unsere Datenbank zugreifen. Es ist ein ziemlich gut entwickeltes System mit etwa 20 Entitäten.JPA- und Tabellenansichten. Kann es gemacht werden?

Wir haben jetzt bestellt, Ansichten für alles zu verwenden. ZB: wenn wir eine Tabelle namens PERMISSION haben, dann brauchen wir auch eine Ansicht namens PERMISSION_VIEW. Grundsätzlich müssen wir dies für jede Tabelle tun, und unsere Anwendungen können nur auf die Daten zugreifen, indem sie die Ansicht abfragen.

Nun sind alle unsere Entity Beans aussehen:

@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 { 

} 
  • Erstens: Wie ist es möglich, Tabellen zu aktualisieren, wenn Sie erlaubt sind Ansichten zu verwenden. Können materialisierte Ansichten dafür verwendet werden?
  • Zweitens, wie viel Umschreiben wird benötigt, wenn wir nur Views verwenden können? Z.B. Für jedes Eniry müssen wir schreiben @Table (Name = "PERMISSION_VIEW"), um die Entität zu beschreiben, ABER, wenn es eine Aktualisierung tut, muss es die Tabelle PERMISSION tun. Wie in aller Welt konsolidieren Sie dies in einer Entity-Bean?
+0

Entschuldigen Sie die offtopic Frage bitte, aber warum sollte jemand das tun wollen? – kostja

+1

Ich arbeite in einer großen Organisation und wir haben einige Datenbankrichtlinien, die von jemandem von irgendwo geschrieben wurden, der sagt, dass wir aus Sicherheits- und Managementgründen Ansichten verwenden müssen. –

+2

Ihre Anwendung benötigt eindeutig Schreibzugriff auf die Datenbank. Ich sehe nicht, welche Sicherheit oder anderer Vorteil dies bietet, wenn Ihre Ansichten dieselben Daten enthalten wie Ihre Tabellen. –

Antwort

5

Die meisten modernen RDBMS unterstützen einfügbar und aktualisierbare Ansichten. Wenn Ihr RDBMS dies unterstützt, sollten Sie kein Problem haben. Eine Ansicht, die mit einer Tabelle identisch ist, sollte in jedem RDBMS, das solche Sichten unterstützt, aktualisierbar sein. Sie müssen also nur Ihr Mapping ändern und die Tabellennamen durch die View-Namen ersetzen.

+0

solange die JPA-Implementierung auch Ansichten unterstützt (was manche tun, DataNucleus JPA sicherlich) – DataNucleus

+2

Alle JPA-Implementierungen, die ich kenne, basieren auf JDBC. Die SQL-Anweisungen werden dieselben sein (einfügen in T ...), unabhängig davon, ob T eine Tabelle oder eine Sicht ist. Deshalb denke ich, dass es nur darauf ankommt, dass das RDBMS eine aktualisierbare Sicht unterstützt, während die JPA-Implementierung nichts davon wissen muss. Es sei denn, ich vermisse etwas. – nakosspy

11

Für weitere Informationen über JPA und Datenbankansichten zu sehen, http://en.wikibooks.org/wiki/Java_Persistence/Advanced_Topics#Views

In JPA Sie zu einem VIEW das gleiche wie eine Tabelle zuordnen können, die @Table Annotation verwenden. Sie können dann jede Spalte in der Ansicht den Attributen Ihres Objekts zuordnen. Ansichten sind normalerweise schreibgeschützt, daher ist die Zuordnung von Objekten zu Ansichten normalerweise auch schreibgeschützt. In den meisten Datenbanken können Ansichten auch aktualisiert werden, je nachdem, wie komplex die Abfrage ist, die sie einkapseln. Selbst bei komplexen Abfragen können Datenbank-Trigger normalerweise zum Aktualisieren in die Ansicht verwendet werden.