当前位置: 首页 > 面试题库 >

带有Grails的Hibernate和PostgreSQL

巫坚白
2023-03-14
问题内容

有一种简单的方法可以将hibernate设置为对每个带有postgres的表使用不同的主键ID。我试图在数据源中使用postgres方言:

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.javasrc/java/com/my/custom你的Grails项目中。

接下来,更新您的语言DataSource.groovy以使用此新的自定义方言。

dialect = com.my.custom.TableNameSequencePostgresDialect

差不多了。不 容易, 但是可以做到。



 类似资料:
  • 问题内容: 我是初次使用Hibernate和Java。我收到以下异常。我在网上找到的有关此错误的信息似乎没有帮助。有任何想法吗?例外: 被称为的地方: 映射到数据库表的类: 谢谢, 谭 问题答案: 尝试在文件中的下添加元素。 我在JPA / EntityManager上所做的工作还不止这些,所以我不知道是否有添加整个程序包的方法。AFAIK在使用时,必须直接指定每个持久类。

  • 问题内容: 我正在使用Hibernate,EJB和Restfull Web服务。我在下面有这个例外,我不知道该怎么办。 问题答案: AbstractMethodError通常是由不兼容的二进制文件引起的;对于此特定错误,有一个打开的(未解决的)故障单,但带有一些注释 例如,原始问题报告提到了一个问题,该问题调用EntityManagerFactory.createEntityManager(jav

  • 我正在从GlassFish 4迁移到WildFly8应用程序服务器并收到以下错误: 我使用Hibernate空间和PostGIS。对于Glassfish服务器,我将postgis jar添加到 /lib/ext文件夹以修复该错误。 我按照本教程中的步骤:https://gist.github.com/bjornharrtell/3054462,但它对我不起作用,即我将这些模块添加到 /org/hi

  • 我对Hibernate Spring MVC有几个问题。这是我从控制器调用数据库实体的示例: 控制器 服务 数据库服务 带有命名查询的car服务 汽车储存库 汽车实体 @Table(name = "car ",catalog = "ATS ")公共类car实现java.io.Serializable { 车型(外键链接,一对多关系) 车队实体 收购实体 我正在使用maven和4.2.1.RELEA

  • 我有_client-cert.pem和client-key.pem和ca.pem文件,我正试图将它们添加到grails项目中。 使用client-keystore.p12文件创建Java密钥库 keytool-importkeystore-srckeystore客户端-keystore.p12-srcstoreType pkcs12\-srcstorePass mypassword-destkey

  • 问题内容: 在Spring 4和Hibernate 4中,我可以使用Reflection通过以下代码从当前环境中获取Hibernate Configuration对象: 使用Hibernate 5时,我必须使用some ,这些对象似乎都不可用。我还试图用同。但是它确实说这是错误的一种。 还有其他方法可以使它正常工作吗? 问题答案: 我想加总Aviad的答案,以按照OP的要求完成它。 内部: 为了获