2017-12-11 12 views
1

Ich verwende Hibernate und Oracle. Ich möchte ein Objekt speichern und seine ID erhalten, die von einem Auslöser generiert wird, der eine Sequenz verwendet. (Die Verwendung eines Triggers ist eine Voraussetzung.) Es gibt zwei Möglichkeiten, die ID zur Verfügung zu haben: 1) finde den Maximalwert der ID-Spalte; 2) finde den aktuellen Wert der Sequenz. Bei beiden Methoden tritt das gleiche Problem auf, nämlich dass zwischen dem Speichern dieses Objekts und dem Abrufen der ID eine weitere Einfügung stattfinden kann. Wie kann ich solche vorzeitigen Einsätze vermeiden?Wie bekomme ich die richtige ID nach dem Speichern eines Hibernate-Objekts?

Darüber hinaus treten diese beiden Ereignisse in einer Transaktion auf, die nach dem Abrufen der ID nicht endet. Mit anderen Worten, danach werden Dinge geschehen. Wenn ich also die Tabelle sperre, wird die Sperre erst freigegeben, wenn die Transaktion beendet ist. Das ist nicht akzeptabel.

Antwort

0

Wenn Sie die Sequenz-ID generation strategy für Sie Entität verwenden, sollten Sie dieses Problem überwinden, wie:

1) Sie allocationSize angeben können, die für Sie bestimmte Anzahl von Ids up-front zuweisen würde und verfügbar sein für Sie innerhalb einer bestimmten Transaktion.

2) Sobald Sie session.save(entity) oder entityManager.persist(entity) rufen, wird die Id nach dem Aufruf von Ihnen sofort zur Verfügung, ohne die Notwendigkeit, bis zum Ende des Transaktionsverfahrens zu warten, und die tatsächlichen flush und commit.

Verwandte Themen