2011-09-28 9 views
6

Hazırda bekleme durumundaki her tablo için farklı birincil anahtar kimlikleri kullanacak şekilde hazırda bekletmenin kolay bir yolu var mı? Ben DataSource postgres lehçesini kullanmaya çalıştı:Grails ile Hazırda Bekletme ve PostgreSQL

dialect = org.hibernate.dialect.PostgreSQLDialect 
or 
dialect = net.sf.hibernate.dialect.PostgreSQLDialect 

Ama çalışmıyor. Teşekkürler

cevap

13

Kısa yanıt, hayır, kolay yolunda bunu yapamazsınız. Ancak, işe yarayan bir çözüm buldum. Temel olarak özel bir lehçe uygulamanız gerekir. İşte bir uygulama (lütfen yorumların içerisindeki uygulamanın orijinal kaynağını not edin).

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

} 

Yukarıdaki uygulama sizin Grails proje içinde src/java/com/my/custom altında TableNameSequencePostgresDialect.java olarak saklanmalıdır edilir.

Ardından, bu yeni özel lehçeyi kullanmak için DataSource.groovy numaralı telefonunuzu güncelleyin.

dialect = com.my.custom.TableNameSequencePostgresDialect 

Bu konuda oldukça fazla. kolay değil, ancak yapılabilir.

+0

Çok teşekkürler. Sadece – Pietro

+0

çalışır. Kendimi araştırmak için biraz zaman harcadım ve özel bir uygulamaya başvurmam gerektiğinden dolayı hayal kırıklığına uğradım. Ancak, dediğin gibi, çalışır. :) –

+4

Bu, http://grails.1312388.n4.nabble.com/One-hibernate-sequence-is-used-for-all-Postgres-tables-td1351722.html –