我正在开发一个带有spring数据和hibernate的spring mvc webapp。
我有一个由布尔字段和整数字段组成的实体。
开始时,boolean字段为false,Integer字段为null。
当布尔字段变为真时,我需要为整数字段分配一个唯一值等于MAX(seq)+1
为此,我以这种方式编写我的服务方法:
@Override
public synchronized Obj save(Obj entry) {
if (entry.getBool() && entry.getSeq() == null){
Integer seq = objRepository.getLastSeq();
if (seq == null){
seq = 1;
}
entry.setSeq(seq);
}
return entry.save(entry);
}
在我的Reposiroty中:
@Query("select MAX(seq)+1 FROM Obj")
Integer getLastSeq();
我把synchronized关键字放到服务方法中,以确保一次只有一个线程可以获得一个唯一的MAX + 1号码..但我不确定它是否适用于所有情况,如果它是正确的方式。
我能确定它能保证seq的独特性吗?
谢谢 马可
答案 0 :(得分:2)
看起来你的整数是入门ID还是不是?那么为什么不使用数据库序列,例如@id注释:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
答案 1 :(得分:1)
示例如何为此目的使用初始化bean。
@Service
public class SequenceInitializer implements InitializingBean{
@Autowired
private ObjRepository objRepository;
@Autowired
private Service service;
@Override
public void afterPropertiesSet() throws Exception {
try {
Integer max = objRepository.getLastSeq();
service.setLastSeq(max);
} catch(Exception e){...}
}
在您的服务中,setLastSeq将设置AtomicInteger字段。