Automatische Generierung von Hibernate-Schlüsseln mit MySQL und Oracle

8

Ich arbeite an einer Java -Anwendung, die CRUD-Vorgänge (mit Hibernate 4.3.8) in zwei verschiedenen Datenbanken mit demselben Datenbankschema durchführen sollte. Es gibt eine MySQL (Version 5.1.73) und eine Oracle (11g Express Edition Version 11.2.0.2.0 - 64bit) Datenbank.

Java-Klassen mit JPA-Annotationen wurden aus den Datenbanktabellen mit Hibernate-Codegenerierung generiert.

Das Problem ist, dass wir jetzt die automatische Primärschlüsselgenerierung verwenden müssen und MySQL GenerationType.IDENTITY verwendet und Oracle GenerationType.SEQUENCE verwendet. Darüber hinaus müssen wir in einigen seltenen Fällen den Primärschlüssel manuell einstellen.

Der folgende Code in der annotierten Klasse funktioniert mit automatischer Schlüsselgenerierung für beide Datenbanken, schlägt jedoch fehl, wenn ein Primärschlüssel selbst gesetzt ist.

%Vor%

Ohne die @GeneratedValue und @SequenceGenerator -Anmerkungen ist es möglich, den Primärschlüssel manuell festzulegen, aber die automatische Generierung funktioniert nicht.

    
Simon Schürg 09.06.2015, 12:08
quelle

2 Antworten

9

Auch wenn Sie GenerationType.AUTO ohne SEQUENCE-spezifischen Parameter verwendet haben, können Sie zugewiesene Bezeichner nicht speichern.

Es gibt einige Problemumgehungen, wenn Sie Kompromisse eingehen möchten:

  1. Eine Möglichkeit wäre, zu zugewiesenen Bezeichnern zu wechseln. Sie können UUID Identifikatoren verwenden, die sowohl für MySQL als auch für Oracle funktionieren, und Sie können die Werte auch manuell zuweisen.

  2. Eine andere Möglichkeit ist die Verwendung eines benutzerdefinierten Tabellengenerators.

    Zuerst definieren Sie eine identifizierbare Schnittstelle:

    %Vor%

    Dann erweitern Sie den Tabellengenerator:

    %Vor%

    Dieser Generator kann zugewiesene Bezeichner mit synthetisch erzeugten Bezeichnern mischen:

    %Vor%

    Generieren der folgenden Anweisungen:

    %Vor%

Für Oracle können Sie die SEQUENCE und die zugeordneten Generatoren kombinieren, wie in dieser Artikel .

Kurz gesagt, unter Berücksichtigung des folgenden Generators:

%Vor%

Sie können es wie folgt Ihren Entitäten zuordnen:

%Vor%     
Vlad Mihalcea 25.06.2015, 07:47
quelle
2

Versuchen Sie etwas wie folgt:

%Vor%

Und diese Tabelle in der Datenbank:

%Vor%

Dies funktioniert in Oracle und MS SQL Server und MySql mit JBoss als App Server.

Weitere Informationen hier: Ссылка

    
John 24.06.2015 13:48
quelle

Tags und Links