PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Hiberner et postgreSQL avec Grails

La réponse courte est non, il n'y a pas de facile façon de faire cela. Cependant, j'ai trouvé une solution qui fonctionne. Fondamentalement, vous devez implémenter un dialecte personnalisé. Voici une implémentation (veuillez noter la source originale de l'implémentation dans les commentaires).

package com.my.custom;

import java.util.Properties;

import org.hibernate.dialect.Dialect;
import org.hibernate.dialect.PostgreSQLDialect;
import org.hibernate.id.PersistentIdentifierGenerator;
import org.hibernate.id.SequenceGenerator;
import org.hibernate.type.Type;


/**
 * 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>
 * @author Burt
 */
public class TableNameSequencePostgresDialect extends PostgreSQLDialect {

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

    /**
     * Creates a sequence per table instead of the default behavior of one sequence.
     */
    public 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
            public void configure(
                            final Type type,
                            final Properties params,
                            final Dialect dialect) {
                    if (params.getProperty(SEQUENCE) == null
                                    || params.getProperty(SEQUENCE).length() == 0) {
                            String tableName = params.getProperty(PersistentIdentifierGenerator.TABLE);
                            if (tableName != null) {
                                    params.setProperty(SEQUENCE, "seq_" + tableName);
                            }
                    }
                    super.configure(type, params, dialect);
            }
    }

}

L'implémentation ci-dessus doit être stockée sous TableNameSequencePostgresDialect.java sous src/java/com/my/custom dans votre projet Grails.

Ensuite, mettez à jour votre DataSource.groovy pour utiliser ce nouveau dialecte personnalisé.

dialect = com.my.custom.TableNameSequencePostgresDialect

C'est à peu près tout. Pas facile mais c'est faisable.