Konfiguration von Hibernate mit Oracle ' s SYS_GUID() für die Primär-Schlüssel
Ich bin auf der Suche nach einem Weg, um hibernate zu benutzen, oracle SYS_GUID()
- Funktion beim einfügen von neuen Zeilen. Derzeit meine DB-Tabellen haben SYS_GUID()
als der Standardwert, so dass, wenn hibernate einfach die generierte SQL weggelassen, dass der Wert, sollte es funktionieren.
Habe ich alles, aber es ist derzeit die Erzeugung der UUID/GUID im code über die system-uuid generator:
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
@Column(name = "PRODUCT_ID", unique = true, nullable = false)
public String getId() {
return this.productId;
}
Ist dies in Ordnung, aber ich würde es vorziehen, dass die guids waren von der Datenbank erzeugt, so dass Sie sequentielle und potenziell eine bessere Leistung. Plus, ich würde nur gerne wissen, wie konfigurieren Sie diese.
Ich bin mit annotations für die Konfiguration, aber xml-Konfigurations-Beispiele sind genial als gut.
Hier ist eine Beispiel-Tabelle definition (falls es wichtig ist):
CREATE TABLE SCHEMA_NAME.PRODUCT
(
PRODUCT_ID RAW(16) DEFAULT SYS_GUID() NOT NULL,
PRODUCT_CODE VARCHAR2(10 CHAR) NOT NULL,
PRODUCT_NAME VARCHAR2(30 CHAR) NOT NULL,
PRODUCT_DESC VARCHAR2(512 CHAR)
)
UPDATE:
Mat ' s sollution mit "guid" gearbeitet, hier ist die sql generiert:
Hibernate:
select rawtohex(sys_guid())
from dual
Hibernate:
insert into PRODUCT
(PRODUCT_CODE, PRODUCT_DESC, LOB_ID, PRODUCT_NAME, PROVIDER_ID, PRODUCT_ID)
values (?, ?, ?, ?, ?, ?)
Es scheint, dass die Verwendung der Spalten mit default-Wert in einem insert ist nicht möglich, so ist die Wahl zwischen einer Anwendung generierte guid und einer Datenbank hin-und Rückfahrt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie können möglicherweise verwenden Sie die "guid" - generator. Sehen dieser Beitrag aus der Hibernate-forum. Es sieht aus wie Sie zusätzliche Unterstützung für Oracle unter Verwendung von
SYS_GUID()
eine Weile zurück, aber die Dokumentation noch sagt, dass Sie nur Unterstützung für SQL Server und MySQL.Ich nicht gearbeitet habe mit JPA-Annotationen noch nicht, aber hier ist ein Beispiel mit XML-Konfiguration:
EDIT: In Bezug auf Ihre zweite Frage, ich denke, Sie werden Fragen, warum der Hibernate nicht tun können, so etwas wie dieses:
Der Grund dafür ist, dass Hibernate muss wissen, was die Objekt-ID ist. Betrachten Sie beispielsweise das folgende Szenario:
Ohne zu wissen, die ID, Hibernate kann das nicht tun. Es braucht die ID um die Frage der UPDATE-Anweisung. Also die Umsetzung von
org.hibernate.id.GUIDGenerator
hat, die zum generieren der ID vorher, und dann später wieder verwenden es in der INSERT-Anweisung.Dies ist der gleiche Grund, warum der Hibernate nicht jeder Batchverarbeitung wenn Sie eine Datenbank generierte ID (einschließlich auto-Inkrement, die auf Datenbanken, die es unterstützen). Mit einer der hilo-Generatoren, oder einer anderen Hibernate-generated-ID-Mechanismus, ist der einzige Weg, um gute Leistung beim einfügen von vielen Objekten auf einmal.
Ich habe die gleiche Aufgabe, das Thema starter. Mit Dank an @Matt Solnit Vorschlag, den ich verwenden, solche Anmerkungen:
strategy = "guid"
undString
Art sind wesentliche Bestandteile der Lösung.Vor anhaltenden neue Elemente Hibernate-Problem SQL-Abfrage:
Mein setup: Oracle 11, Hibernate 4.3.4.Finale, Spring 3.2.x. Und das Feld ist
raw(16)
im Tisch für effiziente Lager-und weniger index-Größe dann, wenn Siechar(32)
.Wenn ich versuche, mit
java.util.UUID
als ID-Feld Typ, den ich erhalten den Fehler aus dem Ruhezustand auf persistierende neue Entität (es versuchenString
Typjava.util.UUID
Feld).Auch ich
javax.xml.bind.DatatypeConverter
für nicht-Hibernate-Abfragen (Spring JDBC-Helfer) für die Weitergabe konvertierenbyte[]
:für das extrahieren von:
Alle web-Controller bekommen-codes wie:
ohne
{
,-
,}
chars (übliche Darstellung eines UUID ist{a-b-c-d-x-y}
wenn Sie sich erinnern). Diese Darstellung bereits die URL-Codierung sauber und sicher. Sie brauchen nicht zu implementierenPropertyEditor
oderConvertor
fürString
Typ:Vergleichen mit dem gescheiterten Versuch zu verwenden
jaa.util.UUID
, wo ich schreiben müssen:in der Reihenfolge zu verwenden:
Ich denke, Sie können tun es, indem Sie den generator auf native. Ich bin mir nicht wirklich sicher, wie es in den Ruhezustand, sondern in NHibernate würden Sie etwas tun, wie dies in der XML: