短い答えはいいえ、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/custom
下TableNameSequencePostgresDialect.java
として格納する必要があります。
次に、この新しいカスタム方言を使用するようにDataSource.groovy
を更新します。
dialect = com.my.custom.TableNameSequencePostgresDialect
これはかなりです。 簡単ではありません。
ありがとうございました。それだけで動作します – Pietro
あなたは大歓迎です。私はこれを自分自身で研究するのにかなりの時間を費やし、カスタム実装に頼らざるを得なかったことに失望しました。しかし、あなたが言ったように、それは動作します。 :) –
これはhttp://grails.1312388.n4.nabble.com/One-hibernate-sequence-is-used-for-all-Postgres-tables-td1351722.htmlにあります。 –