Java 如何从Hibernate获取自定义类型的数据库方言?
所以我写了这篇文章,但是它在SpringBoot1.2.0中坏了,不知道为什么它在1.1.9中工作(或者看起来是这样)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
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引导的配置方式,它仍然可以工作;当然,这取决于你想从哪里得到它。