我在Oracle 11 RDMBS上使用hibernate 5.2和spring 4.3.11
我面临以下问题:我有一个实体;它的PK由4列组成,其中一列是一种计数器。 要求是增加它的值1。
所以我应该做类似的事情:
select max(counter)+1 from myTable t where t.year=2017 and t.type='test';
这种计数器既不是简单的序列。我需要确保计数器值(这是PK的一部分)在多线程环境(例如web one)中每个客户端是唯一的
到目前为止,我写的是:
一个oracle函数,以便计算计数器
事务隔离SERIALIZABLE
的Spring事务方法
在我的交易方法
我想知道这是否是解决这些问题的好方法。
我无法创建oracle函数或存储过程来保存对象
这是我的交易方法框架:
@Transactional(transactionManager = "hibTx", rollbackFor = DbException.class, readOnly = false, isolation=Isolation.SERIALIZABLE)
public void saveMyEntity(Entity t) throws DbException{
try
{
EntityPK id = t.getId();
//Oracle DAO is a DAO where I have method to call oracle functions and stored
Long nextCounter = oracleDao.getNextValue( id.getYear(), id.getType(), t.getCode().longValue() ).longValue();
id.setCounter(nextCounter);
t.setId(id);
repository.persist(t);
}
catch (Exception e)
{
String msg = "Error; "+e.getMessage();
logger.error(msg, e);
throw new DbException(msg);
}
}
欢迎任何建议
谢谢
安吉洛