【问题标题】:How can I get the database dialect from Hibernate for a Custom Type?如何从 Hibernate 获取自定义类型的数据库方言?
【发布时间】:2015-03-01 07:26:13
【问题描述】:

所以我写了这个,但是它在 Spring Boot 1.2.0 中破坏了,不知道为什么它在 1.1.9 中起作用(或看起来)

package com.xenoterracide.rpf.infrastructure.db;

import org.hibernate.type.AbstractSingleColumnStandardBasicType;
import org.hibernate.type.PostgresUUIDType;
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
import org.hibernate.type.descriptor.java.UUIDTypeDescriptor;
import org.hibernate.type.descriptor.sql.SqlTypeDescriptor;
import org.hibernate.type.descriptor.sql.VarcharTypeDescriptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.util.Properties;

public class UUIDCustomType extends AbstractSingleColumnStandardBasicType {
    public static final String UUID = "uuid-custom";
    private static final Logger log = LoggerFactory.getLogger( UUIDCustomType.class );

    private static final long serialVersionUID = 902830399800029445L;

    private static final SqlTypeDescriptor  SQL_DESCRIPTOR;
    private static final JavaTypeDescriptor TYPE_DESCRIPTOR;

    static {
        Properties properties = new Properties();
        try {
            ClassLoader loader = Thread.currentThread().getContextClassLoader();
            properties.load( loader.getResourceAsStream( "database.properties" ) );
        }
        catch ( IOException e ) {
            throw new RuntimeException( "Could not load properties!", e );
        }

        String dialect = properties.getProperty( "dialect" );
        SQL_DESCRIPTOR
                = dialect.equals( "org.hibernate.dialect.PostgreSQLDialect" )
                  ? PostgresUUIDType.PostgresUUIDSqlTypeDescriptor.INSTANCE
                  : VarcharTypeDescriptor.INSTANCE;

        log.debug( "dialect {}", dialect );

        TYPE_DESCRIPTOR = UUIDTypeDescriptor.INSTANCE;
    }

    public UUIDCustomType() {
        super(SQL_DESCRIPTOR, TYPE_DESCRIPTOR);
    }

    @Override
    public String getName() {
        return UUID;
    }

}

looks like it might have something to do with attempting to get the nonexistant properties file

我如何从 Hibernate 或 Spring 中获取方言?

【问题讨论】:

    标签: java spring hibernate spring-boot


    【解决方案1】:

    看起来您非常依赖 Spring Boot 打包的内部实现。它可能会起作用,但它可能会在版本之间发生变化,这会使您的应用变得脆弱。

    我想不出好的解决方案,但Retrieve auto-detected hibernate dialect 中建议了一个更好的解决方案,即获取SessionFactory 的引用,将其转换为SessionFactoryImplementor,然后调用@987654324 @关于那个。这仍然不是一个好的解决方案,因为在 Hibernate 的某个未来版本中,演员可能会停止工作,但这不太可能。

    【讨论】:

    • 如果我依赖它(或者我怀疑某些引导顺序得到了优化,我不确定)我不知道我在做什么,我根据另一个站点的建议构建了这个类,它似乎有效......遗憾的是,该链接上的答案并没有解释如何获取 SessionFactory,也不确定我是否可以让 Spring 连接它,或者确保它使用 Springs(由 Spring Boot 配置)配置.因此,如果我更改了 Spring Boot 的配置方式,它仍然可以工作。
    • 从 sessionFactory 获取方言:方言 dialect = ((CriteriaBuilderImpl) criteriaBuilder).getEntityManagerFactory().getJdbcServices().getDialect();但当然,这取决于你想从哪里得到它。
    猜你喜欢
    • 2021-04-02
    • 2017-06-09
    • 2022-12-14
    • 2019-06-19
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多