2012-06-22 65 views
0

我有一个Hibernate中的类的子值列表。我最初的实现是一个Set,但它返回的是本质上'数据库顺序'的值(可能基于聚集索引,这几乎是插入顺序)。在Hibernate中订购集合的最佳方式是什么?

我看着切换到List,所以我添加了一个,但是我很快遇到了一个问题,那就是返回的java List中有空值。我的一些数据是由Hibernate编写的,但其中一些数据也是由SQL脚本编写的。

我想要的是一个sortOrder属性,它不与列表中的位置绑定,因此如果有重复的{1,3,3,10},它将被适当地映射到{0,1 ,2,3}第二和第三项的顺序返回到数据库顺序。空值也是好的,我不在乎是否将它们放在列表的前面或后面(只要行为是一致的)。

我看着Bag,但我不确定如何将sortOrder属性放入定义中,而且我有点担心它允许重复。我仍然喜欢和我在创建Set时一样的约束(我相信父/子元组始终是唯一的)。

对此提出建议?我可以使用sortOrder对包进行调整,使其充当List而不是带有索引的List?我还需要做些什么来保护代码免于被SQL直接输入的数据挂起?

回答

1

我在一个项目中遇到了同样的问题。我可以使用的最后一个版本是使用数据库触发器以正确的顺序保存这些位置数据。触发器获取列表中的记录并将它们排列在正确的位置并更新位置。

我不认为你会有任何其他选择,因为你正在改变数据使用SQL和休眠。

+0

有之间的竞争条件行可见的时间和触发器更新的时间?在创建模式之后,我猜你正在运行SQL来添加触发器? –

+0

我正在使用sql server,并且触发器是trasaction过程的一部分,所以不会出现计时问题。这个触发器在sql中被加密,并且只是作为更新触发器添加到isssue表中。这种方式非常干净,并阻止所有空值进入您的位置柱。 –

+0

我一定会考虑它,但到目前为止我是数据库不可知的,所以我宁愿找到100%的Hibernate解决方案。你玩过袋子吗? –

0

如果您在使用Hibernate的注解,你可以使用javax.persistence.OrderBy由指定的属性命令“内存”中的元素,而不会引入一个索引列,请参阅:

http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#entity-hibspec-collection

+0

我一直没有使用注释,我只是有一个HBM文件的架构布局。我看到了orderBy机制,但我的首选是将大部分排序保留在数据库中,因为对于我的许多实现来说,这实际上是一个比应用程序框更大功率的大型单独框。 –

+0

另外,我真的很喜欢sortOrder列,因为我没有对数据进行排序,而是对用户的数据排序(这无疑是有点不合理的:-) –

相关问题