postgres JPA 報錯"org.hibernate.MappingExceptception: No Dialect mapping for JDBC type: 1111

之前項目中使用的數據源是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的方言,重啓驗證。。。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章