Dies ist nicht gut dokumentiert, viele der Lösungen auf hier und anderen Websites beziehen sich auf ältere Versionen von Hibernate, wo der HiLo sequenceGenerator der Standard war. Aber nach der Untersuchung fand ich die zugrunde liegende Ursache ist, dass JBoss EAP 6
hibernate.id.new_generator_mappings=true
standardmäßig setzt, die anstelle der älteren Version eine org.org.hibernate.id.enhanced.SequenceStyleGenerator verwendet.
Das Standard-Inkrement des Hibernate SequenceStyleGenerators ist 1 (überprüfen Sie den Code!), JPA überschreibt jedoch den Inkrementwert in diesem Generator auf 50. Dies bedeutet, dass der Generator die Sequenz nextval betrachtet und einen Cache mit 50 IDs verwendet. beginnend mit nextval - 49. Wenn diese erschöpft sind, liest der Generator die nächste Sequenz von Orakel und wiederholt den Vorgang. Sobald die erste Reihe von IDs erschöpft ist, sehen wir doppelte Schlüssel.
So ist die Auflösung:
1) Entweder definieren Sie Ihre Oracle-Sequenz (en) mit einem Zuwachs von 50 der PPV Standard übereinstimmen
CREATE SEQUENCE MY_SEQ
START WITH 50
MAXVALUE 9999999999999999999
INCREMENT BY 50
NOCYCLE;
oder
2) In allocationSize = 1 für die Annotation @SequenceGenerator - dies zwingt den SequenceGenerator zum Zurückgehen, um den nächsten Wert aus der Oracle-Sequenz für jede benötigte ID zu lesen (mit einer möglichen Auswirkung auf die Leistung)
@SequenceGenerator(name = "USERS_ID_GENERATOR", sequenceName = "MY_SEQ", allocationSize = 1)
oder
3) definieren die Oracle-Sequenz INCREMENT durch einen anderen Wert, und sicherzustellen, dass die allocationSize einstimmt.
Beantwortete meine eigene Frage in der Hoffnung, anderen zu helfen, die dieses Problem ansprechen.
Obwohl ich nach anderen Informationen suche, die Art, wie Sie Informationen hinzugefügt haben, um anderen zu helfen, verdienen +1. – kosa