使用spring数据和hibernate保证唯一数字生成

时间:2013-03-21 08:14:22

标签: spring hibernate jpa spring-mvc spring-data

我正在开发一个带有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的独特性吗?

谢谢 马可

2 个答案:

答案 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字段。