簡體   English   中英

使用存儲過程,JPA和Hibernate堅持使用SQL Server 2008

[英]Persisting to SQL Server 2008 using stored procedures, JPA and Hibernate

我們正在實施一個網頁來維護組織結構。 該結構存儲在SQL Server 2008中,並使用新的HierarchyID數據類型。 因為我們在使JPA和Hibernate使用這種新數據類型時遇到了問題,所以我們決定使用視圖和存儲過程來抽象該數據類型。 因此,我們想使用存儲過程來持久化我們的實體,但如何使用JPA尚不清楚。

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

首先,我們是否采用正確的方法[...]

這要看情況。 如果您不介意與數據庫引擎綁定,那么我想完全受益於HierarchyID類的專有功能並不是完全錯誤的。 但是你沒有使用新功能,...

其次,是否可以使用存儲過程來持久化使用JPA注釋的實體?

據我所知, 您可以使用“本機查詢”(請參閱@NamedNativeQuery和/或EntityManager#createNativeQuery() )來調用存儲過程,但是您不能使用它們來持久化實體,至少不能用於JPA。 如果您不介意使用Hibernate擴展,請查看@SQLInsert(callable=true, ...) (請參閱第2.4.11節“ Hibernate Annotations文檔的CRUD操作自定義SQL” )。


就個人而言,我發現創建視圖,存儲過程以及僅使用HierarchyID來處理JPA擴展非常麻煩。 新功能很棒……當它們確實簡化了事情時,而不是當它們增加更多復雜性時在這里就是這種情況)。 換句話說,因為使用HierarchyID並不能真正解決任何問題,所以我寧願堅持使用經典的parent_id列(即使這不太可能發生,這也會使更改數據庫引擎的過程更加平滑)。

我們已經確定了一種方法,該方法在需要處理層次結構ID數據類型時使用本地查詢來調用存儲過程。 這使我們避免使用任何專有的SQL,同時仍能從新數據類型中受益。

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

例如,要獲得區域'n'深度結構中所有訂單的計數,辦公室,商店和部門可以使用以下內容:

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

@ ChssPly76感謝您對兩個模型的引用。 我將在以后閱讀:)

您可以使用@Pascal建議的內容,也可以使用

@org.hibernate.annotations.NamedNativeQuery(
     callable=true,
     name="queryname",
     readOnly=true,
     query="call sproc_name(?,:param)",
     resultSetMapping="your_result_mapping"
)

有關選項的完整列表,請參見javadoc

這種方法的唯一問題是out參數(如果需要)必須是第一個,並且必須輸出一個refcursor。

也看到這個 (它指的是功能,但可以修改存儲過程)。 這些示例基於Oracle,但可以輕松修改MSSQl的調用字符串。

我對HierarchyId不太了解,是否可以將其表示為Hibernate UserType或任何類型?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM