2012-07-04 302 views
18

在我的開發項目中,我使用JPA(hibernate)作爲數據庫訪問的OR映射技術。當我將數據庫表映射到實體時,有時會遇到性能問題和技術難題,從而導致複雜的關係。將SQL視圖映射到JPA實體

我發現一個解決方法是將DB視圖映射到JPA實體。這使得編碼更容易,有時性能更好。你認爲這是以這種方式使用JPA的反模式嗎?

+0

不,它不是,它爲什麼會這樣? –

+1

不管怎樣對你更好的顯然不是「反模式」。 tter for you ... – DataNucleus

回答

12

這不是一個解決方法,也不是反模式。mapping JPA Entities to SQL Views有一個話題。 它給你足夠的信息是否使用這種方法或不。

個人而言,我更喜歡Java類,因此我使用Result Classes Constructor Expression。它基於結果查詢返回實例化並填充提供的類的對象。

您可以查看這兩種提高性能並降低結構複雜度的方法。

+2

我也喜歡將結果映射到結果類,但是我對自定義實體方法有些疑問。根據規範,JPA實體必須有一個'@ Id'字段;但是,您可以擁有包含重複記錄的視圖。你如何處理這種情況? –

+0

這是一個很好的問題。你認爲從視圖的多列創建一個哈希列會有幫助嗎?它可以作爲主要關鍵。 – JMelnik

+0

@JMelnik我也很想用Java類來實現。我有一個關於構造器表達式的問題,我的問題是如果使用構造器表達式,ORDER BY屬性是如何使用的?看到例如[這](http://stackoverflow.com/questions/33852430/jpql-not-a-selected-expression-error)我有一個複雜的查詢,我無法做ORDER BY – user75ponic

0

我對JMelnik友情提供的鏈接存在問題: 我在Javadb中創建了一個View作爲複雜查詢,然後嘗試將視圖拖到窗體上,但是Netbeans不允許我放棄它(因此我可以不自動創建綁定表,我看到該鏈接,我不是一個誰經歷過這是唯一一個爲我工作

解決方案:。

在數據庫創建視圖,爲您的複雜SQL聯接

「在數據庫中創建實體」在實體包中,並將其命名爲xxxViewName

  • 通過在其上添加「@Id」,確保實體中的字段被標識爲密鑰。

導航器創建Java持久性查詢:

  • 確保外形設計是可見的,然後用鼠標右鍵單擊導航「其他組件」,然後選擇添加從調色板> Java持久性>查詢

  • 配置查詢:不要使用通常的「show xxxViewName」(由於JPA不支持show而失敗)。使用select w在xxxViewName W」

創建導航器的Java Persistence結果列表:

  • 類似於創建查詢確保列出的類型參數設置爲

綁定。你的JTable到列表中。