2017-06-14 4 views
0

Haben Tabelle für die Speicherung einiger eindeutiger Bezeichner. Meine erste Idee war für jeden einzelnen Identifikator wie diese Inkrementzählers Spalte zu haben:Spring/JPA - Wie Zähler sicher zu inkrementieren

ID IDENTIFIER COUNTER 
1 B-1  1 
2 A-1  1 
3 A-2  2 
4 A-3  3 
5 B-2  2 
6 BBA-1  1 
7 BBA-2  2 

Jede Kennung, die durch Buchstaben oder eine Kombination aus Buchstaben und erweitert durch eine laufende Nummer vorangestellt. Zum Beispiel, wenn ich einen neuen Bezeichner mit A-Präfix hinzufügen möchte, muss Max-Wert des Zählers wählen, wobei IDENTIFIER mit 'A-' beginnt, zurückgegebener Wert um eins erhöht, mit gesuchtem Präfix verkettet und in der Datenbank beibehalten wird. Mit diesem Ansatz habe ich Angst vor Nebenläufigkeit Probleme, wenn zwei parallele Threads greifen den gleichen Wert des Zählers, Eindeutigkeit Regel würde verletzt werden.

Wie kann ich das verhindern? Ist es besser Ansatz zwei Tabellen haben, wo man nur medizinischen Versorgung individueller Zähler für jede Kennung Basis nehmen würde, wie folgt aus:

BASE COUNTER 
A 3 
B 2 
BBA 2 

Does Frühling oder JPA haben einen Mechanismus, mit diesem für den Umgang? Die erste Idee, die ich im Moment habe, ist optimistisches Sperren und @Version Annotation. Wäre es nützlich, weil ich bereits JPA-Mappings in meinem Projekt habe?

+0

Können Sie erklären, warum Ihre Kennungen im Format [Briefe] - [Nummer] sind? Was bedeutet das? Was ist die Beziehung zwischen Record A-1 und Record A-2? Was haben Sie gemeinsam? – Solace

+0

Format von "Bezeichner" ist nicht so wichtig für dieses Problem. Sagen wir, dass diese Buchstaben etwas sind. Sie werden mit sequenziellem Suffix und Parallelität der Datenbank generiert. – shx

+0

Ich fragte, weil die Annotation der Version für das beschriebene Problem wie Overkill wirkt. Sie können die ID-Annotation für mehrere Spalten in Ihrer Entität verwenden. Daher würde ich vorschlagen, dass Sie die Buchstaben und die Zahl in zwei separate Spalten aufteilen und sie beide mit der ID-Annotation markieren. Sie können die Annotation GeneratedValue verwenden, um diese Zahlenspalte automatisch zu erhöhen. Beachten Sie, dass die Verwendung mehrerer ID-Anmerkungen in Hibernate zulässig ist, jedoch nicht JPA-kompatibel ist. Wenn Sie bei den JPA-Regeln bleiben möchten, können Sie die Annotation "EmbeddedId" anzeigen. – Solace

Antwort

-1

Sie können CAS für MySQL verwenden.

  1. wählen COUNTER von $ your_table wo IDENTIFIER = $ your_IDENTIFIER

hier $ count bekam

  1. Update $ your_table Satz COUNTER = ($ count + 1) wo IDENTIFIER = $ your_IDENTIFIER und COUNTER = $ count
+0

Dies ist nicht genau die Lösung für das Problem – shx

Verwandte Themen