0

1 つのオブジェクトを作成するときは、database.object を調べて、テーブル内のそのオブジェクトの最大キーを見つける必要があります。最大数を見つけたら、それを 1 増やす必要があり、新しいオブジェクトはその新しいキーを持つことになります。これらのキーはオブジェクト タイプに依存しており、多くのタイプがあるため、id を使用できません。

例: テーブル オブジェクト

Id, Name, Type, Key
1,  One,   T1,   6
2,  Two,   T1,   3
3,  Three, T2,   88
4,  Four,  T1,   101

私が直面している問題: より多くのユーザーが新しいオブジェクトを作成できます (そして、いくつかの計算があるため、この操作はあまり高速ではありません)、時には 2 人以上のユーザーが同じキーを使用してしまうことがあります?!

jdbc を使用すると、SELECT .. FOR UPDATE を使用してテーブルをロックできます。

休止状態を使用してこれを達成するための推奨される解決策はありますか?

ありがとう

4

4 に答える 4

1

DB に新しい値を保存するときは、 ACID 操作が必要です。必要なフィールドの最大数へのアクセス、および新しい ID の作成とコミット操作の人口へのアクセスは単一のユニットである必要があり、トランザクションはこの機能を提供します。

あなたの設定がよくわかりません。Hibernate Transactionsを使用できます。

いくつかの条件もある最大行値にアクセスできます。ドキュメントも参照してください。

public Long maxRowValue()
    {

        Criteria crit = sess().createCriteria(YourEntity.class);    
        crit.setProjection(Projections.max("Key"));
        crit.add( Restrictions.eq("Type", 1));
        List<Long> teams = crit.list(); 
        return teams.get(0);

    }

PS私はあなたの設定の詳細を知りません。それに応じてコードを変更する必要があります。

于 2013-05-10T18:37:33.777 に答える
0

私はかつてそのような問題を抱えていました。テーブルには複数列の主キーがあり、最後の要素はプレフィックス列に対して一意でした。

列とでテーブルSEQUENCESを作成しました。キーは次のようになりました。KEYCURR_VALUE

tablename_col1value_col2value

例えば:

cities_1_2
cities_1_3
cities_3_4

これにより、指定されたキーをロックし、値を取得し、テーブルの値を増やして値を返すストアド プロシージャを作成できます。SELECT MAX毎回発行するよりもはるかに高速です。

于 2013-05-10T13:25:23.857 に答える