2016-04-26 6 views
1

Ich habe ein Problem im Zusammenhang mit System generierte Uniquer Identifier.Einfügen von Daten in DB mit System-UUID

Unten finden Sie die Definition eines Datamember von meiner Bean-Klasse:

@Id 
@GeneratedValue(generator = "system-uuid") 
@GenericGenerator(name = "system-uuid", strategy = "uuid") 
@Column(name = "id") 
private String id; 

Immer, wenn der Client-Aktion aufgerufen wird, werden die Daten an die DB beibehalten werden basierend mit dem Wert für id-Attribut dynamisch generiert unter Verwendung der oben System-UUID . Jetzt habe ich eine Anforderung, bei der ich eine Masseneinfügung zu dieser Tabelle durchführen muss. Da es keine Importfunktionalität gibt, gibt es eine Möglichkeit, die Bulk-Einfügung aus dem Backend mithilfe von Oracle-Einfügeabfragen durchzuführen. Wenn ja, wie erwähne ich den Wert für die Spalte "id", so dass es genauso funktioniert wie die Einfügung vom Client.

+0

Verwenden SYS_GUID https://docs.oracle.com/cd/B12037_01/server.101/ b10759/Funktionen153.htm. – ibre5041

Antwort

1

Die Verwendung von SYS_GUID ist sehr effektiv für die Bulk-Einsätze, wie unten auf einem kleines Beispiel simuliert

INSERT INTO TARGET_TABLE 
select 
rawtohex(sys_guid()) uuid 
from dual connect by level <= 3 
; 

Das einzige (optisch) Problem ist, dass die erzeugte Zeichenfolge nicht wie erwartet aus dem Java-UUID formatiert ist.

UID       
-------------------------------- 
BBEDBA2A9BB44952AA5EE311D0880C39 
B95CA374AC7C4619A68543771101D590 
6B4E89CF0307427BBD047E42BD6DFBB0 

Eine einfache Unterabfrage und einige substr s mit einer Verkettung das Mittel bringt - siehe here:

with t as (
    select rawtohex(sys_guid()) guid from dual 
    connect by level <= 3 
) 
select guid, lower(substr(guid, 1, 8) 
    ||'-'|| substr(guid, 9, 4) 
    ||'-'|| substr(guid, 13, 4) 
    ||'-'|| substr(guid, 17, 4) 
    ||'-'|| substr(guid, 21, 12)) as formatted_guid 
from t; 


GUID        FORMATTED_GUID      
-------------------------------- ------------------------------------ 
993712381A8543FB9320C587D078330E 99371238-1a85-43fb-9320-c587d078330e 
FFF3CF7104E048BF8E6677B080BD35A6 fff3cf71-04e0-48bf-8e66-77b080bd35a6 
1FBCC67EA46B4474B26128F2DDAA519B 1fbcc67e-a46b-4474-b261-28f2ddaa519b 
+0

Vielen Dank Marmite, es hat funktioniert! – AsteriK

+1

Der Grund dafür ist, dass Oracles UUID RAW (16) ist, mit einer effektiveren Speicherung anstelle von CHAR (36). – ibre5041