Pie*_*tro 6 postgresql grails hibernate primary-key
有一种简单的方法可以将hibernate设置为使用postgres为每个表使用不同的主键ID吗?我试图在DataSource中使用postgres方言:
dialect = org.hibernate.dialect.PostgreSQLDialect
or
dialect = net.sf.hibernate.dialect.PostgreSQLDialect
Run Code Online (Sandbox Code Playgroud)
但它不起作用.谢谢
Jos*_*ore 13
简短的回答是否定的,没有一种简单的方法可以做到这一点.但是,我找到了一个可行的解决方案.基本上你需要实现一个自定义方言.这是一个实现(请注意评论中的实现的原始来源).
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
上述实施应当存储为TableNameSequencePostgresDialect.java下src/java/com/my/custom你的Grails项目中.
接下来,更新您DataSource.groovy的使用这个新的自定义方言.
dialect = com.my.custom.TableNameSequencePostgresDialect
Run Code Online (Sandbox Code Playgroud)
这几乎就是它.不容易,但可以做到.
| 归档时间: |
|
| 查看次数: |
3449 次 |
| 最近记录: |