2009-11-18 80 views
0

我們正在實現一個網頁來維護組織結構。該結構存儲在SQL Server 2008中,並使用新的HierarchyID數據類型。因爲我們在使用這種新的數據類型獲得JPA和Hibernate時遇到了問題,所以我們決定使用視圖和存儲過程來抽象出這種數據類型。所以我們希望使用存儲過程來堅持我們的實體,但是如何使用JPA來做到這一點還不清楚。堅持SQL Server 2008使用存儲過程,JPA和休眠

首先,我們是否採取了正確的方法,其次,是否可以使用存儲過程來持久化使用JPA註釋的實體?

回答

1

我們已經確定了一種方法,在我們需要處理層次結構ID數據類型時,我們使用本機查詢調用存儲過程。這使我們能夠避免擁有任何專有SQL,同時仍能獲得新數據類型的好處。

我們的理解和初步發現是,層次結構ID允許我們通過簡單地請求給定節點的所有後代來跨樹結構聚合數據。

例如獲得全部訂單的數量跨區域,辦公室,商店和部門一個「n」深度結構可以使用類似以下內容:

SELECT COUNT(Orders) FROM Orders WHERE NodeOrderedAt.IsDescendantOf(@Node) 

@ ChssPly76感謝引用到兩種型號。我將在後面閱讀這些內容:)

1

首先,是我們採取正確的做法[...]

嗯,這取決於。如果你不介意被綁定到你的數據庫引擎,那麼我想這並不是完全錯誤的想從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列(即使這是一個非常不可能發生的事件,這也會使數據庫引擎變得更加流暢)。

+0

以上所有內容均爲+1;它不僅僅是插入/更新 - **任何處理HierarchyID的查詢都必須寫成SQL。看起來更麻煩,而不是值得。作爲一個小的 - 「parent_id」不是映射層次結構的方法:-) – ChssPly76 2009-11-18 16:39:28

+0

@ ChssPly76非常感謝:)對於我的文化,我對父/子層次結構缺少什麼?我現在懷疑,但在http://docs.jboss.org/hibernate/core/3.3/reference/en/html/example-parentchild.html找不到答案。讓我知道,以便我可以修復那部分。 – 2009-11-18 17:01:07

+0

哦,它不是休眠特定的。通過'parentId'映射層次結構稱爲'鄰接列表模型'。它在某些特殊情況下有其用途,但總體而言效率很低。 「嵌套集模型」可以說是一種更好的方法,雖然在「移動」操作上稍微複雜一些並且性能較差。你可以谷歌任何一個更多的細節。 – ChssPly76 2009-11-18 18:39:23

0

您可以用什麼@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或任何類型?

+0

我提到了原生查詢,但是...這不回答*是否可以使用存儲過程**持久**使用JPA *部分註釋的實體。 – 2009-11-18 16:01:16