2010-12-10 1 views
3

Comment puis-je renommer hibernate_sequence? Les méthodes pour générer une séquence par table (et donner des noms spécifiques à ces séquences) sont bien documentées, mais ce n'est pas ce que je cherche. Cela ne me dérange pas d'avoir une séquence partagée par toutes les classes de domaine - j'ai juste besoin de lui donner un nom spécifique à l'application.Remplacer le nom de séquence par défaut dans Grails

Répondre

1

Il semble y avoir une demande de fonctionnalité/amélioration ouverte dans la JIRA Hibernate pour la rendre globalement configurable: Make the default sequence name globally configurable. Je crois que, pour contourner le problème, vous devez définir l'attribut 'generator' sur le même nom pour toutes les classes de domaine (par défaut hibernate_sequence) pour chaque champ @Id. Voir oracle sequence created.

Comme vous avez fait allusion dans votre question, il pourrait y avoir un moyen de le faire par votre dialecte sous-classement base de données - comme beaucoup l'ont suggéré une séquence par table approche.

Voir id generator and DRY principle

+0

Il me semble avoir eu succès en étendant org.hibernate.id.SequenceGenerator et le dialecte. –

2

Voici le code que j'utilisé pour définir le nom de la séquence.

D'abord, le SequenceGenerator:

package com.foo; 

import java.util.Properties; 

import org.hibernate.MappingException; 
import org.hibernate.dialect.Dialect; 
import org.hibernate.id.SequenceGenerator; 
import org.hibernate.type.Type; 

public class TableNameSequenceGenerator extends SequenceGenerator { 

    public static final String CUSTOM_SEQUENCE_NAME = "MYAPP_SEQUENCE" 

    public void configure(Type type, Properties params, Dialect dialect) throws MappingException { 
     if(params.getProperty(SEQUENCE) == null || params.getProperty(SEQUENCE).length() == 0) { 
      String seqName = CUSTOM_SEQUENCE_NAME; 
      params.setProperty(SEQUENCE, seqName);    
     } 
     super.configure(type, params, dialect); 
    } 

} 

Ensuite, le OracleDialect:

package com.foo; 

import org.hibernate.dialect.Oracle10gDialect; 

public class MyAppOracleDialect extends Oracle10gDialect { 
    public Class getNativeIdentifierGeneratorClass() { 
     return TableNameSequenceGenerator.class; 
    } 
} 

dernier, DataSource.groovy a besoin de connaître le dialecte:

dataSource { 
    pooled = true 
    driverClassName = "oracle.jdbc.OracleDriver" 
    // username, password.... 
    dialect='com.foo.MyAppOracleDialect' 
} 
Questions connexes