Java 如何从Hibernate获取自定义类型的数据库方言?

Java 如何从Hibernate获取自定义类型的数据库方言?,java,spring,hibernate,spring-boot,Java,Spring,Hibernate,Spring Boot,所以我写了这篇文章,但是它在SpringBoot1.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.descr

所以我写了这篇文章,但是它在SpringBoot1.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;
    }

}
破洞了


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

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


我一时想不出好的解决方案,但中建议了一个更好的解决方案,即获取对
SessionFactory
的引用,将其转换为
SessionFactoryImplementor
,然后调用
getdialante
。这仍然不是一个好的解决方案,因为在Hibernate的未来版本中,cast也可能会停止工作,但这种可能性不大。

如果我依赖于它(或者我怀疑某些引导顺序得到了优化,我不确定),我不知道我在做,我根据另一个站点的建议构建了这个类,它似乎起了作用。。。遗憾的是,该链接上的答案没有太多解释如何获取SessionFactory,也不确定我是否可以让Spring连接它,或者确保它使用Spring(通过Spring引导配置)配置。因此,如果我更改Spring引导的配置方式,它仍然可以工作;当然,这取决于你想从哪里得到它。