PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Hibernate &postgreSQL mit Grails

Die kurze Antwort ist nein, es gibt kein einfaches Weg, dies zu tun. Ich habe jedoch eine Lösung gefunden, die funktioniert. Grundsätzlich müssen Sie einen benutzerdefinierten Dialekt implementieren. Hier ist eine Implementierung (bitte beachten Sie die Originalquelle der Implementierung in den Kommentaren).

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);
            }
    }

}

Die obige Implementierung sollte als TableNameSequencePostgresDialect.java gespeichert werden unter src/java/com/my/custom innerhalb Ihres Grails-Projekts.

Aktualisieren Sie als Nächstes Ihre DataSource.groovy um diesen neuen benutzerdefinierten Dialekt zu verwenden.

dialect = com.my.custom.TableNameSequencePostgresDialect

Das ist so ziemlich alles. Nicht einfach aber es kann getan werden.