2016-06-13 4 views
1

In Hibernate 3.6 migriert hatten wir einen funktionierenden Code sowohl MySQL- und Oracle:Unterschiedliches Verhalten von GenerationType.AUTO + @SequenceGenerator wenn aus dem Ruhezustand 3,6-5,1

@Id 
@Column(name = "id", nullable = false) 
@SequenceGenerator(name = "applicationEventLog", sequenceName = "S_APPLICATION_EVENT_LOG") 
@GeneratedValue(strategy = GenerationType.AUTO, generator = "applicationEventLog") 
private Integer id; 

Auf MySql Autoincrement verwenden und auf Oracle war es unter Verwendung der mit sequenceName angegebenen Sequenz. Es ist also eine Sequenz, die von uns in db erstellt wurde, nicht von einem Winterschlaf.

Nach der Aktualisierung von Hibernate auf 5.1 verwendet es nicht mehr die in @SequenceGenerator angegebene Sequenz, sondern verwendet hibernate_sequence und die IDs stehen in Konflikt mit den vorhandenen. Wenn ich Generation zu FOLGE ändern:

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "applicationEventLog") 

es nicht verwenden, um die angegebenen Reihenfolge, aber SEQUENCE ist MySql nicht anwendbar.

Gibt es eine Möglichkeit, das alte Verhalten zu erreichen: GenerationType.AUTO zu haben, aber die Sequenz mit dem in @SequenceGenerator angegebenen Namen verwenden?

+0

Sie können zum alten Verhalten zurückkehren, indem Sie die Eigenschaft hibernate.id.new_generator_mappings auf false setzen, z Im Frühjahr geben Sie Folgendes an: false. Diese Eigenschaft ist standardmäßig in Hibernate 5+ –

Antwort

1

Wir diese gelöst haben, indem die in dem Ruhezustand @GenericGenerator statt @SequenceGenerator:

@Id 
@Column(name = "id", nullable = false) 
@GenericGenerator(name = "applicationEventLog", strategy = "native", parameters = { 
     @Parameter(name = SequenceStyleGenerator.SEQUENCE_PARAM, value = "S_APPLICATION_EVENT_LOG"), 
}) 
@GeneratedValue(generator = "applicationEventLog") 
private Integer id; 
1

AUTO bedeutet, dass es dem JPA-Anbieter überlassen bleibt, welchen Generatortyp er verwendet. SEQUENCE zwingt es, eine SEQUENCE zu verwenden. Gemäß der JPA-Spezifikation. Wenn Sie einen bestimmten Generator wollen, dann sollten Sie IT SPEZIFIZIEREN, anstatt auf den PPV-Anbietern nur über das gleiche passieren, wie man wollte wirklich

+0

Ich kann keine bestimmte Strategie verwenden, wenn verschiedene db-Engines unterschiedliche Strategien verwenden. 'AUTO' verwendet autoincrement auf mysql und sequence on oracle, und das ist ok, ich brauche nur einen Weg, um es zu sagen, die angegebene Sequenz zu verwenden. Wie es früher in Hibernate 3 der Fall war. – veljkost

+1

Deshalb gibt es orm.xml, so dass Sie einen für jeden Datenspeicher haben können. Dann würde MySQL orm.xml IDENTITY verwenden, und Oracle orm.xml würde SEQUENCE usw. verwenden. Bei Verwendung einiger JPA-Anbieter ist die fest codierte interne Funktion im Wesentlichen nicht tragbar; Die einzige wirklich portable Möglichkeit ist die Verwendung der Route "orm.xml". –

Verwandte Themen