我們正在實現一個網頁來維護組織結構。該結構存儲在SQL Server 2008中,並使用新的HierarchyID數據類型。因爲我們在使用這種新的數據類型獲得JPA和Hibernate時遇到了問題,所以我們決定使用視圖和存儲過程來抽象出這種數據類型。所以我們希望使用存儲過程來堅持我們的實體,但是如何使用JPA來做到這一點還不清楚。堅持SQL Server 2008使用存儲過程,JPA和休眠
首先,我們是否採取了正確的方法,其次,是否可以使用存儲過程來持久化使用JPA註釋的實體?
我們正在實現一個網頁來維護組織結構。該結構存儲在SQL Server 2008中,並使用新的HierarchyID數據類型。因爲我們在使用這種新的數據類型獲得JPA和Hibernate時遇到了問題,所以我們決定使用視圖和存儲過程來抽象出這種數據類型。所以我們希望使用存儲過程來堅持我們的實體,但是如何使用JPA來做到這一點還不清楚。堅持SQL Server 2008使用存儲過程,JPA和休眠
首先,我們是否採取了正確的方法,其次,是否可以使用存儲過程來持久化使用JPA註釋的實體?
我們已經確定了一種方法,在我們需要處理層次結構ID數據類型時,我們使用本機查詢調用存儲過程。這使我們能夠避免擁有任何專有SQL,同時仍能獲得新數據類型的好處。
我們的理解和初步發現是,層次結構ID允許我們通過簡單地請求給定節點的所有後代來跨樹結構聚合數據。
例如獲得全部訂單的數量跨區域,辦公室,商店和部門一個「n」深度結構可以使用類似以下內容:
SELECT COUNT(Orders) FROM Orders WHERE NodeOrderedAt.IsDescendantOf(@Node)
@ ChssPly76感謝引用到兩種型號。我將在後面閱讀這些內容:)
首先,是我們採取正確的做法[...]
嗯,這取決於。如果你不介意被綁定到你的數據庫引擎,那麼我想這並不是完全錯誤的想從HierarchyID
等專有功能中受益。但你不有使用新功能...
其次,是否有可能使用存儲過程來堅持使用JPA註解實體?
據我所知,沒有。您可以使用「原生查詢」調用存儲過程(請參閱@NamedNativeQuery
和/或EntityManager#createNativeQuery()
),但不能用它們來堅持實體,至少不能與JPA一起使用。如果您不介意使用Hibernate擴展,請查看@SQLInsert(callable=true, ...)
(請參閱Hibernate Annotations文檔的2.4.11. Custom SQL for CRUD operations一章)。
就個人而言,我覺得很麻煩創建視圖,存儲過程和處理JPA擴展只是使用HierarchyID
。新功能很酷...當他們做簡化的事情,而不是當他們增加更多的複雜性,其中是在這裏的情況。換句話說,因爲使用HierarchyID
並沒有真正解決任何問題,所以我認爲我寧願堅持使用經典的parent_id
列(即使這是一個非常不可能發生的事件,這也會使數據庫引擎變得更加流暢)。
您可以用什麼@Pascal建議,或者您也可以使用
@org.hibernate.annotations.NamedNativeQuery(
callable=true,
name="queryname",
readOnly=true,
query="call sproc_name(?,:param)",
resultSetMapping="your_result_mapping"
)
看到javadoc的選項
完整列表用這種方法唯一的問題是,從參數(如果你需要一個)必須是第一個,並且必須輸出一個refcursor。
另請參閱this(它指的是功能,但可以修改爲sprocs)。這些示例基於Oracle,但調用字符串很容易修改爲MSSQl。
我不太瞭解HierarchyId是否可以表示爲Hibernate的UserType或任何類型?
我提到了原生查詢,但是...這不回答*是否可以使用存儲過程**持久**使用JPA *部分註釋的實體。 – 2009-11-18 16:01:16
以上所有內容均爲+1;它不僅僅是插入/更新 - **任何處理HierarchyID的查詢都必須寫成SQL。看起來更麻煩,而不是值得。作爲一個小的 - 「parent_id」不是映射層次結構的方法:-) – ChssPly76 2009-11-18 16:39:28
@ ChssPly76非常感謝:)對於我的文化,我對父/子層次結構缺少什麼?我現在懷疑,但在http://docs.jboss.org/hibernate/core/3.3/reference/en/html/example-parentchild.html找不到答案。讓我知道,以便我可以修復那部分。 – 2009-11-18 17:01:07
哦,它不是休眠特定的。通過'parentId'映射層次結構稱爲'鄰接列表模型'。它在某些特殊情況下有其用途,但總體而言效率很低。 「嵌套集模型」可以說是一種更好的方法,雖然在「移動」操作上稍微複雜一些並且性能較差。你可以谷歌任何一個更多的細節。 – ChssPly76 2009-11-18 18:39:23