sql >> Databáze >  >> RDS >> PostgreSQL

Hibernate &postgreSQL s Grails

Krátká odpověď zní ne, není to snadné způsob, jak to udělat. Nicméně jsem našel řešení, které funguje. V podstatě musíte implementovat vlastní dialekt. Zde je implementace (poznamenejte si prosím původní zdroj implementace v komentářích).

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

}

Výše uvedená implementace by měla být uložena jako TableNameSequencePostgresDialect.java pod src/java/com/my/custom v rámci vašeho projektu Grálů.

Dále aktualizujte svůj DataSource.groovy používat tento nový vlastní dialekt.

dialect = com.my.custom.TableNameSequencePostgresDialect

To je asi tak všechno. Není to snadné ale dá se to udělat.




  1. Analýza statistik tabulky PostgreSQL

  2. Sekvence nejsou ovlivněny transakcemi?

  3. Jak nainstalovat MySQLdb na Mountain Lion

  4. Odstraňte duplicitní značky MySQL