有一个简单的方法可以设置Hibernate在使用PostgreSQL时为每个表使用不同的主键ID吗? 我尝试在DataSource中使用PostgreSQL方言:
dialect = org.hibernate.dialect.PostgreSQLDialect
or
dialect = net.sf.hibernate.dialect.PostgreSQLDialect
但它不起作用。 谢谢。
有一个简单的方法可以设置Hibernate在使用PostgreSQL时为每个表使用不同的主键ID吗? 我尝试在DataSource中使用PostgreSQL方言:
dialect = org.hibernate.dialect.PostgreSQLDialect
or
dialect = net.sf.hibernate.dialect.PostgreSQLDialect
简而言之,没有一种简单的方法可以做到这一点。不过,我已经找到了一个解决方案,它确实有效。基本上,你需要实现一个自定义方言。以下是一个实现示例(请注意,在注释中提供了实现的原始来源)。
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);
}
}
}
上述实现应该被保存为TableNameSequencePostgresDialect.java
,存储在Grails项目的src/java/com/my/custom
目录下。DataSource.groovy
文件,使用这个新的自定义方言。dialect = com.my.custom.TableNameSequencePostgresDialect
基本上就是这样了。虽然不< b >容易,但是可以做到。