如何在Hibernate和/或分布式环境中订购对象?

时间:2012-10-01 16:00:05

标签: java hibernate caching

我需要以任意顺序保留某些对象(由用户随意决定),但我不知道哪种方法最好。

我一直在考虑在我的实体中设置一个整数顺序字段并让用户对它们进行排序但是这种方法让我很烦恼,因为我们有3台服务器调度请求而且我相信如果我更新数据库中的顺序它会迫使我每当我想根据该订单进行计算时更新/合并我的权利。

另一种方法是使用IMDG或缓存来设置共享位置的顺序,并查询这些位置以进行这些计算,但我相信这对于此类任务来说是过度的。

哪种方法最好?还是其他?

2 个答案:

答案 0 :(得分:1)

具有整数顺序列的方法是可能的。然后,您还将一个版本列添加到数据库中(可能您已经有一个),当一个用户更改订单时,必须保存包含新订单号的所有记录。由于版本列,其他用户会收到通知,因为修改后的订单,他们必须重新加载他们的数据。除了整数之外,您还可以使用小数点后面的一些数字或字符串 - 这两者都更容易更新那些在顺序中确实有新位置的行,而不是更新表中的所有行。

这种方法的不便之处在于,用户必须重新加载行(这意味着他必须重新进行实际修改),因为不同的用户改变了订单。如果这种情况很少发生,你可以忍受它,但如果顺序发生变化,这可能是不可接受的。

为了避免这种不便,您只能为订单创建一个单独的表(作为订单号,数据表的键和版本列的列)。该表与数据表具有1:1的关系。当订单发生变化时,只需更新此表,这意味着其他用户在修改任何记录的数据时不会受到骚扰。在这种情况下,您甚至可以实现不同的订单(例如,每个用户都可以定义自己的订单) - 这会将数据表的关系从1:1更改为n:1。

共享位置中的缓存只有在出现性能问题或者不需要将订单持久存储到数据库中时才会执行(订单仅对一个会话有效)。

答案 1 :(得分:0)

我不确定我是否正确理解了这个问题。如果不同的用户可以定义自己的订单,那么订单应该以某种方式转到用户的配置文件,它可以是分隔的表或字段。

为什么要将特定于用户的信息添加到实体表中?或者我误解了这个问题?