使用hibernate从表中获取最大数量

时间:2013-05-10 12:49:19

标签: java hibernate

当我创建一个对象时,我需要查看database.object并在表中找到该对象的最大键。当我找到最大数量时,我需要它将它增加1并且我的新对象将具有该新密钥。这些键依赖于对象类型,并且有很多类型,所以我不能使用id。

示例:表对象

Id, Name, Type, Key
1,  One,   T1,   6
2,  Two,   T1,   3
3,  Three, T2,   88
4,  Four,  T1,   101

我面临的问题:更多的用户可以创建新对象(并且有一些计算,所以这个操作不是很快),有时两个或更多用户最后使用相同的密钥?!

使用jdbc我可以使用SELECT .. FOR UPDATE和锁定表。

我是否有任何推荐的解决方案如何使用hibernate实现这一目标?

由于

4 个答案:

答案 0 :(得分:1)

在数据库中保存新值时,需要ACID operation。访问最大数量的必需字段和新id创建和提交操作的数量应该是一个单元,Transactions提供此功能。

我不确定您的配置。您可以使用Hibernate Transactions

您可以访问具有某些条件的最大行值。另请参阅the docs

public Long maxRowValue()
    {

        Criteria crit = sess().createCriteria(YourEntity.class);    
        crit.setProjection(Projections.max("Key"));
        crit.add( Restrictions.eq("Type", 1));
        List<Long> teams = crit.list(); 
        return teams.get(0);

    }

P.S。我不知道你的配置细节。代码应该相应地改变。

答案 1 :(得分:0)

在某些情况下,我有同样的需求。我所做的是创建一个保持最大值的新表。此表只有一行,因此很容易读取,您无需锁定整个表。只要您想获取新密钥或更新密钥,只能使用此表。 然后你的交易

  • 首先锁定此表
  • 然后它读取其内容,
  • 然后使用它来设置新实体中的键值
  • 然后存储新实体
  • 使用新值
  • 更新max_key表
  • 最后提交并释放锁。

答案 2 :(得分:0)

首先,您使用的基础DBMS是什么?

某些数据库(实际上大多数数据库)具有处理自动ID生成的特殊功能,同时保持事务隔离。例如,Oracle数据库具有“on before before”触发器,可用于实现您的需求。

顺便说一下,“关键”值必须是连续的,还是仅仅是唯一的就足够了?

答案 3 :(得分:0)

我曾经遇到过这样的问题。这些表具有多列主键,最后一个元素对于前缀列是唯一的。

我创建了一个包含列SEQUENCESKEY的表CURR_VALUE。键看起来像这样:

  

tablename_col1value_col2value

例如:

cities_1_2
cities_1_3
cities_3_4

通过这种方式,您可以编写将锁定给定键的存储过程,获取值,增加表中的值并返回值。它比每次发布SELECT MAX要快得多。