1

我正在开发一个带有spring数据和hibernate的spring mvc webapp。

我有一个由布尔字段和整数字段组成的实体。

一开始,布尔字段为假,整数字段为空。

当布尔字段变为真时,我需要为整数字段分配一个等于 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);
}

在我的存储库中:

@Query("select MAX(seq)+1 FROM Obj")
Integer getLastSeq();

我将同步关键字放在服务方法中,以确保一次只有一个线程可以获得唯一的 MAX+1 数字。但我不确定它是否适用于所有情况以及它是否是正确的方法。

我可以确定它保证 seq 的唯一性吗?

谢谢马可

4

2 回答 2

2

看起来您的 Integer 是条目 id 还是不是?那么为什么不使用数据库序列,例如带有@id 注释:

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
于 2013-03-21T08:30:11.480 回答
1

Example how to use initializing bean for that purpose.

@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){...}

 }

In your service setLastSeq will set AtomicInteger field.

于 2013-03-21T09:40:08.827 回答