之前項目中使用的數據源是Greeplum(GP),現在在本地windows安裝了pg代替gp,其他運行都還好。就一個sql時出現了一個異常:
org.springframework.orm.jpa.JpaSystemExceException: No Dialect mapping for JDBC type: 1111; nested exception is is org.hibernate.MappingExceptception: No Dialect mapping for JDBC type: 1111
at at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernbernateAccessException(on(HibernateJpaDialect.java:314)
a)
at at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceExceptionIfPossible(le(HibernateJpaDialect.java:225)
a)
at at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceExceptionIfPossible(le(AbstractEntityManagerFactoryBean.java:527)
a)
at at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceExceptionIfPossible(le(ChainedPersistenceExceptionTranslator.java:61)
a)
at at org.springframework.dao.support.DataAccessUtils.translateIfNeIfNecessary(ry(DataAccessUtils.java:242)
a)
因爲實現的是:jpa的方式,不存在Hibernate的那一套mapping。。。
最後找了一通,是因爲pg配置的數據源的問題。。現更改爲:
添加配置類
package com.trs.idap.config;
import org.hibernate.dialect.PostgreSQL94Dialect;
import org.hibernate.type.descriptor.sql.SqlTypeDescriptor;
import org.hibernate.type.descriptor.sql.VarcharTypeDescriptor;
import java.sql.Types;
/**
* @創建人:Young
* @時 間: 2019/4/12
* @描 述: TODO
*/
public class PgDialect extends PostgreSQL94Dialect {
@Override
public SqlTypeDescriptor remapSqlTypeDescriptor(SqlTypeDescriptor sqlTypeDescriptor)
{
switch (sqlTypeDescriptor.getSqlType())
{
case Types.CLOB:
return VarcharTypeDescriptor.INSTANCE;
case Types.BLOB:
return VarcharTypeDescriptor.INSTANCE;
case 1111://1111應該是pgsql的json
return VarcharTypeDescriptor.INSTANCE;
}
return super.remapSqlTypeDescriptor(sqlTypeDescriptor);
}
public PgDialect() {
super();
registerHibernateType(1111, "string");
}
}
將該類應用到數據庫應用中
package com.trs.idap.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.Database;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.persistence.EntityManager;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactoryGreenplum", //實體管理引用
transactionManagerRef = "transactionManagerGreenplum", //事務管理引用
basePackages = {"com.trs.idap.repository.greenplum"}) //設置 myagenDataSource應用到的包
public class GreenPlumConfiguration {
@Autowired
@Qualifier(value = "GPSource")
private DataSource gpDataSource;
/**
* 注入JPA配置實體
*/
@Autowired
private JpaProperties jpaProperties;
/**
* 通過調用JPA配置實體中的解析方法,解析datasource中各屬性的值
* @param dataSource 數據源
* @return 本數據源中各參數
* Map中設值分別爲:
* hibernate-dialect 方言
* hibernate.hbm2ddl.auto DDL執行策略
* hibernate.physical_naming_strategy 命名策略
*
*這些和不同類型數據庫密切相關的屬性設置,不能設置在application.properties中,所以需要再不同的數據源中具體設置,賦值給JpaProperties
*/
private Map<String,String> getVendorProperties(DataSource dataSource){
jpaProperties.setDatabase(Database.POSTGRESQL);
Map<String,String> map = new HashMap<>();
map.put("hibernate.dialect","com.trs.idap.config.PgDialect");
// map.put("hibernate.hbm2ddl.auto","update");
// map.put("hibernate.physical_naming_strategy","org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl");
jpaProperties.setProperties(map);
return jpaProperties.getHibernateProperties(dataSource);
}
/**
* 配置EntityManagerFactory實體
* @param builder
* @return 實體管理工廠
* packages 掃描@Entity註釋的軟件包名稱
* persistenceUnit 持久性單元的名稱。 如果只建立一個EntityManagerFactory,你可以省略這個,但是如果在同一個應用程序中有多個,你應該給它們不同的名字
* properties 標準JPA或供應商特定配置的通用屬性。 這些屬性覆蓋構造函數中提供的任何值。
*
*/
@Bean(name = "entityManagerFactoryGreenplum")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryGreenplum(EntityManagerFactoryBuilder builder){
return builder
.dataSource(gpDataSource)
.properties(getVendorProperties(gpDataSource))
.packages(new String[]{"com.trs.idap.domain.entity.greenplum"})
.persistenceUnit("GreenPlumDiscountPersistenceUnit")
.build();
}
/**
* 配置EntityManager實體
* @param builder
* @return 實體管理器
*/
@Bean(name = "entityManagerGeenplum")
public EntityManager entityManager(EntityManagerFactoryBuilder builder){
return entityManagerFactoryGreenplum(builder).getObject().createEntityManager();
}
/**
* 配置事務transactionManager
* @param builder
* @return 事務管理器
*/
@Bean(name = "transactionManagerGreenplum")
public PlatformTransactionManager transactionManagerGreenplum(EntityManagerFactoryBuilder builder){
return new JpaTransactionManager(entityManagerFactoryGreenplum(builder).getObject());
}
}
此時配置pg的方言,重啓驗證。。。