Ich arbeite an einer Java Anwendung, die CRUD-Operationen tun soll (mit Hibernate 4.3.8) auf zwei verschiedene Datenbanken mit dem gleichen Datenbankschema. Es gibt eine MySQL (Version 5.1.73) und eine Oracle (11g Express Edition Release 11.2.0.2.0 - 64bit) -Datenbank.Hibernate Autoschlüsselgenerierung mit MySQL und Oracle
Java-Klassen mit JPA-Anmerkungen wurden aus den Datenbanktabellen mit Hibernate-Codegenerierung generiert.
Das Problem ist, dass wir jetzt die Notwendigkeit der Verwendung von Auto-Primärschlüsselgenerierung haben und MySQL verwendet GenerationType.IDENTITY und Oracle verwendet GenerationType.SEQUENCE. Außerdem 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.
@GeneratedValue(strategy=GenerationType.AUTO, generator="sequence_generator")
@SequenceGenerator(name="sequence_generator", sequenceName="SEQUENCE1")
@Column(name = "id", unique = true, nullable = false)
public Integer getId() {
return this.id;
}
Ohne die @GeneratedValue und @SequenceGenerator Anmerkungen ist es möglich, den Primärschlüssel manuell einstellen, aber Auto Generation nicht funktioniert.
dieses [Versuchen Sie manuell festlegen, the value-of-a- Primärschlüssel-in-jpa-generierteWertspalte] [1]. Da gibt es viele Lösungen. [1]: http://stackoverflow.com/questions/12002260/manually-specify-the-value-of-a-primary-key-in-jpa-generatedvalue-column – Volatile
Die Datenbank-zentrierten Lösung in diesem Thread funktioniert nicht für mich, da das Datenbankschema nicht geändert werden sollte. Es gibt andere Leute als mich, die sich darauf verlassen, dass sich das Datenbankschema nicht ändert. Und ich weiß nicht, ob es möglich ist und wie man einen eigenen Custom Id Generator schreibt, der beide Datenbanken MySQL UND Oracle (Identity and Sequence) unterstützt. In allen Beispielen verwenden sie entweder IdentifierGenerator OR Sequencegenerator. –
Diese Frage ist nicht klar. Sagen Sie, dass Sie einige Klassen haben, für die Hibernate Kennungen automatisch generieren und Kennungen anderen Klassen manuell zuweisen soll? Oder möchten Sie, dass Hibernate den Instanzen einer Klasse meistens automatisch Kennungen zuweist, aber in einigen Fällen Kennungen manuell einigen Instanzen derselben Klasse zuweisen möchten? – manish