2013-05-22 29 views
11

我們目前有一個Java EE系統,我們使用JPA映射到我們的數據庫。這是一個相當完善的系統,有大約20個實體。JPA和表視圖。可以做到嗎?

我們現在已被命令使用視圖的一切。例如:如果我們有一個名爲PERMISSION的表,那麼我們還需要一個名爲PERMISSION_VIEW的視圖。基本上我們需要對每個表執行此操作,而我們的應用程序只能通過查詢視圖來訪問數據。

現在我們所有的實體bean是這樣的:

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

} 
  • 首先,是如何,如果你只允許使用視圖可以更新表。物化視圖可以爲此工作嗎?
  • 其次,如果我們只能使用視圖,需要多少重寫?例如。對於每個entiry,我們將需要編寫@Table(name =「PERMISSION_VIEW」)來描述實體,但是在做更新時它需要將它做到PERMISSION表。你究竟如何將它整合到一個實體bean中呢?
+0

請原諒問題,但爲什麼有人要這樣做呢? – kostja

+1

我在一個大型組織工作,我們有一些數據庫指導原則,這些指導原則是爲了安全和管理目的,我們需要使用視圖。 –

+2

您的應用程序顯然需要對數據庫的寫入權限。如果您的視圖包含與表格相同的數據,我不會看到提供的安全性或其他優勢。 –

回答

5

大多數現代的RDBMS支持可插入和可更新的視圖。 如果你的RDBMS支持它,那麼你不應該有任何問題。與任何表相同的視圖在任何支持這些視圖的RDBMS中都應該是可更新的。所以你只需要改變你的映射,並用視圖名稱替換表名。

+0

只要JPA實現支持視圖(有些人,DataNucleus JPA肯定會這樣做) – DataNucleus

+2

我知道的所有JPA實現都基於JDBC。無論T是表還是視圖,SQL語句都是相同的(插入T ...)。這就是爲什麼我認爲它只依賴於RDBMS來支持可更新視圖,而JPA實現並不需要知道它。除非我錯過了一些東西。 – nakosspy

11

有關JPA和數據庫視圖查看更多信息,http://en.wikibooks.org/wiki/Java_Persistence/Advanced_Topics#Views

在JPA可以映射到VIEW同一個表,使用@Table批註。然後,您可以將視圖中的每一列映射到對象的屬性。視圖通常是隻讀的,所以對象映射到視圖通常也是隻讀的。在大多數數據庫中,視圖也可以是可更新的,這取決於它們封裝的查詢的複雜程度。即使對於複雜的查詢,通常也可以使用數據庫觸發器來更新視圖。