1

春のデータと休止状態を備えた春の mvc webapp を開発しています。

ブールフィールドと整数フィールドで構成されたエンティティがあります。

最初は、ブール フィールドは false で、整数フィールドは null です。

ブール値フィールドが true になったら、整数フィールドに 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 番号を取得できるようにするために、service メソッドに synchronized キーワードを入れました..しかし、それがすべての状況で機能するかどうか、それが正しい方法であるかどうかはわかりません。

seq の単一性が保証されていると確信できますか?

ありがとうマルコ

4

2 に答える 2

2

あなたの整数はエントリIDのようですか?では、たとえば @id 注釈を使用して、データベース シーケンスを使用しない理由は次のとおりです。

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
于 2013-03-21T08:30:11.480 に答える
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 フィールドを設定します。

于 2013-03-21T09:40:08.827 に答える