2014-05-18 7 views
9

Ich habe Zweifel, welcher der beste Typ für ein Feld ist, das mit @Version für optimistisches Sperren in JPA gekennzeichnet ist.Der beste Typ für das JPA-Versionsfeld für optimistisches Sperren

Die API javadoc (http://docs.oracle.com/javaee/7/api/javax/persistence/Version.html) sagt:

"Folgende Typen für die Version Eigenschaften werden unterstützt: int., Integer, kurz, kurz, lang, Lange, java.sql.Timestamp"

In anderer Seite (http://en.wikibooks.org/wiki/Java_Persistence/Locking#Optimistic_Locking) sagt:..

„JPA unterstützt ein optimistischen Sperren Versionsfeld verwenden, die auf jedes Update aktualisiert werden Das Feld kann entweder numerisch oder ein Zeitstempel Wert ein numerischer Wert als empfohlen Der numerische Wert ist präziser, portabler, performanter und einfacher zu handhaben als ein Zeitstempel. "

"Die Zeitstempelsperre wird häufig verwendet, wenn die Tabelle bereits eine letzte aktualisierte Zeitstempelspalte enthält, und stellt auch eine bequeme Möglichkeit zur automatischen Aktualisierung einer zuletzt aktualisierten Spalte dar. Der Wert der Zeitmarkenversion kann nützlicher sein als eine numerische Version enthält die relevanten Informationen darüber, wann das Objekt zuletzt aktualisiert wurde. "

Die Fragen, die ich habe, sind:

  • ist besser, ein Timestamp-Typ, wenn Sie ein Feld Lastupdated gehen zu müssen, oder besser ein numerisches Versionsfeld und den Zeitstempel in anderem Feld haben?

  • Zwischen numerischen Typen (int, Integer, kurz, kurz, lang, lang) Welches ist das beste zu wählen (unter Berücksichtigung der Länge jedes Typs)? Ich meine, das Beste ist Long, aber es erfordert viel Platz für jede Reihe.

  • Was passiert, wenn das Versionsfeld die letzte Nummer eines numerischen Typs erhält (z. B. 32.767 in einem kurzen Feld)? Wird es im nächsten Schritt wieder bei 1 beginnen?

Antwort

4

Zuerst, wissen Sie, dass Sperren zu verwalteten gleichzeitig Transaktionen verwendet wird.

1.Separate deine Bedenken. Wenn das Feld "Zuletzt aktualisiert" geschäftsmodellspezifisch ist, sollte es von Ihrem Versionierungsfeld getrennt sein - was für - Versionierung gilt.

2.Primitive und Objekte werden normalerweise Ihrer Datenbank als derselbe Typ zugeordnet. Bis auf die Tatsache, dass Boolean standardmäßig Nullable und Boolean "nicht Nullable" sein kann. Erzwingen Sie die Nullität jedoch explizit. In diesem Fall möchten Sie ein primitives Element verwenden, da das Versionsfeld nicht nullfähig sein kann.

Ganzzahl oder lang sind besser als Zeitstempel. Hibernate recommends numeric versionig und sie nehmen nicht so viel Platz.

  1. Wenn Sie lange verwenden, können Sie nicht leben, um herauszufinden.

Verwenden Sie dies und Sie sollten in Ordnung sein.

private long version; 

@Version 
public long getVersion() { 
    return version; 
} 

public void setVersion(long version) { 
    this.version = version; 
} 
3

Gehen Sie einfach mit Long oder Integer. ABER geh nicht mit int oder lang. Im Gegensatz zu anderen Kommentaren hier, Null-Wert wird erwartet, wenn Entity noch nie persistent war. Wenn Sie "int" oder "long" verwenden, wird Hibernate möglicherweise denken, dass die Entity bereits persistent und im Status "distanziert" ist, da der Versionswert 0 ist, wenn er nicht gesetzt ist. Debuggen Sie gerade eine FK-Verletzung, wo "int" die Ursache war, also sparen Sie Ihre Zeit und gehen Sie einfach mit Long oder Integer.

Verwandte Themen