当我创建一个对象时,我需要查看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实现这一目标?
由于
答案 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)
在某些情况下,我有同样的需求。我所做的是创建一个保持最大值的新表。此表只有一行,因此很容易读取,您无需锁定整个表。只要您想获取新密钥或更新密钥,只能使用此表。 然后你的交易
答案 2 :(得分:0)
首先,您使用的基础DBMS是什么?
某些数据库(实际上大多数数据库)具有处理自动ID生成的特殊功能,同时保持事务隔离。例如,Oracle数据库具有“on before before”触发器,可用于实现您的需求。
顺便说一下,“关键”值必须是连续的,还是仅仅是唯一的就足够了?
答案 3 :(得分:0)
我曾经遇到过这样的问题。这些表具有多列主键,最后一个元素对于前缀列是唯一的。
我创建了一个包含列SEQUENCES
和KEY
的表CURR_VALUE
。键看起来像这样:
tablename_col1value_col2value
例如:
cities_1_2
cities_1_3
cities_3_4
通过这种方式,您可以编写将锁定给定键的存储过程,获取值,增加表中的值并返回值。它比每次发布SELECT MAX
要快得多。