2009-11-18 83 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