2011-09-28 14 views
6

ポストグルを使ってテーブルごとに異なる主キーIDを使うようにhibernateを設定する簡単な方法はありますか? 私は、DataSourceにPostgresの方言を使用しようとしました:Grailsを使ったHibernateとpostgreSQL

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

をしかし、それは動作しません。 ありがとう

答えて

13

短い答えはいいえ、easyこれを行う方法はありません。しかし、私は動作する解決策を見つけました。基本的にカスタムの方言を実装する必要があります。ここに実装があります(コメント内の実装の元のソースに注意してください)。

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

} 

上記の実装では、あなたのGrailsプロジェクト内src/java/com/my/customTableNameSequencePostgresDialect.javaとして格納する必要があります。

次に、この新しいカスタム方言を使用するようにDataSource.groovyを更新します。

dialect = com.my.custom.TableNameSequencePostgresDialect 

これはかなりです。 簡単ではありません。

+0

ありがとうございました。それだけで動作します – Pietro

+0

あなたは大歓迎です。私はこれを自分自身で研究するのにかなりの時間を費やし、カスタム実装に頼らざるを得なかったことに失望しました。しかし、あなたが言ったように、それは動作します。 :) –

+4

これはhttp://grails.1312388.n4.nabble.com/One-hibernate-sequence-is-used-for-all-Postgres-tables-td1351722.htmlにあります。 –

関連する問題