sql >> Database teknologi >  >> RDS >> PostgreSQL

Hibernate &postgreSQL med grale

Det korte svar er nej, der er ikke en let måde at gøre dette på. Jeg har dog fundet en løsning, der virker. Dybest set skal du implementere en tilpasset dialekt. Her er en implementering (bemærk venligst den oprindelige kilde til implementeringen i kommentarerne).

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

}

Ovenstående implementering skal gemmes som TableNameSequencePostgresDialect.java under src/java/com/my/custom inden for dit Grails-projekt.

Opdater derefter din DataSource.groovy for at bruge denne nye brugerdefinerede dialekt.

dialect = com.my.custom.TableNameSequencePostgresDialect

Det handler stort set om det. Ikke let men det kan lade sig gøre.




  1. MySQL:betingelse på resultatet af GROUP_CONCAT?

  2. Antal opdateringer

  3. Maksimal række i DBMS

  4. Giver flere fremmednøgler mening?