2016-11-03 5 views
3

Ich möchte einen benutzerdefinierten Sequenzgenerator in Hibernate 5 erstellen, um eine Sequenz pro Tabelle in PostgreSQL zu erstellen. Mit Hibernate 4 Ich habe folgend in meinem Dialekt:Benutzerdefinierte Sequenzgenerator für Hibernate 5

/** 
* Get the native identifier generator class. 
* 
* @return TableNameSequenceGenerator. 
*/ 
@Override 
Class<?> getNativeIdentifierGeneratorClass() { 
    TableNameSequenceGenerator 
} 

/** 
* Creates a sequence per table instead of the default behavior of one sequence. 
* From <a href='http://www.hibernate.org/296.html'>http://www.hibernate.org/296.html</a> 
*/ 
static class TableNameSequenceGenerator extends SequenceGenerator { 

    /** 
    * {@inheritDoc} 
    * If the parameters do not contain a {@link SequenceGenerator#SEQUENCE} name, we 
    * assign one based on the table name. 
    */ 
    @Override 
    void configure(final Type type, final Properties params, final Dialect dialect) { 

     Boolean sequencePerTable = Holders.config.getProperty(SEQUENCE_PER_TABLE, Boolean, true) 

     if (sequencePerTable) { 
      if (!params.getProperty(SEQUENCE)) { 
       String tableName = params.getProperty(TABLE) 
       String schemaName = params.getProperty('schemaName') 
       if (schemaName) { 
        params.setProperty(SCHEMA, schemaName) 
       } 
       if (tableName) { 
        params.setProperty(SEQUENCE, "seq_${tableName}") 
       } 
      } 
     } 
     super.configure(type, params, dialect) 
    } 
} 

Sie können den vollständigen Code sehen hier: https://github.com/kaleidos/grails-postgresql-extensions/blob/master/src/main/groovy/net/kaleidos/hibernate/PostgresqlExtensionsDialect.groovy#L53

Ich versuche Hibernate 5 zu migrieren, aber ich weiß nicht, wie das konfigurieren vorheriges Verhalten. Ich habe den Code geändert, um von SequenceStyleGenerator zu erweitern, da jetzt SequenceGenerator veraltet ist, aber mein Code nie ausgeführt wird. Ich denke, das hat damit zu tun, dass auch die Methode getNativeIdentifierGeneratorClass veraltet ist.

Ich habe nach einer Möglichkeit gesucht, eine benutzerdefinierte Sequenz zu erstellen, aber alle Beispiele, die ich gefunden habe, konzentrieren sich darauf, meine Domänenklasse mit dem Sequenzgenerator zu kommentieren. Ich suche nach einer Möglichkeit, alle Sequenzen global zu definieren.

+0

'spring.jpa.hibernate.use-new-ID-Generator-Mappings: true' Config erforderlich in' application.yml' um 'SequenceStyleGenerator' zu verwenden – dmahapatro

+0

Auf einer Seite zur Kenntnis,' getNativeIdentifierGeneratorClass () 'kann durch' getNativeIdentifierGeneratorStrategy() 'ersetzt werden, die einen' String' zurückgeben – dmahapatro

+0

'use-new-id-generator-mappings' funktioniert möglicherweise nicht in einer Grails-App, da dies für Spring-Daten jpa spezifisch ist. – dmahapatro

Antwort

0

Wie angemerkt Graeme (https://github.com/grails/grails-core/issues/10234) der Standardname der Sequenz in dem Ruhezustand 5, das Hinzufügen so geändert hat

id generator: 'sequence', params: [sequence_name: 'book_seq']

der Abbildungsblock den Trick. Das Problem ist, dass es notwendig ist, das zu jeder Domain-Klasse hinzuzufügen.

Ich bin immer noch auf der Suche nach einer Möglichkeit, diese Einstellung global zu definieren, möglicherweise prefer_sequence_per_entity auf True für jede Entität festlegen.

UPDATE: Schließlich haben wir eine Problemumgehung gefunden, um eine Sequenz pro Tabelle global zu definieren. Fügen Sie einfach Folgendes in die Datei application.groovy:

grails.gorm.default.mapping = { 
    id generator: 'org.hibernate.id.enhanced.SequenceStyleGenerator', params: [prefer_sequence_per_entity: true] 
} 
0

Vielen Dank Ivan! Ich habe nur diese Konfiguration ausprobiert, was auch funktioniert hat.

grails.gorm.default.mapping = { 
     id params: [prefer_sequence_per_entity: true] 
} 
Verwandte Themen