org.dspace.storage.rdbms.hibernate.postgres.DSpacePostgreSQL82Dialect.java Source code

Java tutorial

Introduction

Here is the source code for org.dspace.storage.rdbms.hibernate.postgres.DSpacePostgreSQL82Dialect.java

Source

/**
 * The contents of this file are subject to the license and copyright
 * detailed in the LICENSE and NOTICE files at the root of the source
 * tree and available online at
 *
 * http://www.dspace.org/license/
 */
package org.dspace.storage.rdbms.hibernate.postgres;

import org.hibernate.dialect.PostgreSQL82Dialect;
import org.hibernate.metamodel.spi.TypeContributions;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.type.PostgresUUIDType;
import org.hibernate.type.descriptor.sql.LongVarcharTypeDescriptor;
import org.hibernate.type.descriptor.sql.SqlTypeDescriptor;

import java.sql.Types;

/**
 * UUID's are not supported by default in hibernate due to differences in the database in order to fix this a custom sql dialect is needed.
 * Source: https://forum.hibernate.org/viewtopic.php?f=1&t=1014157
 *
 * @author kevinvandevelde at atmire.com
 */
public class DSpacePostgreSQL82Dialect extends PostgreSQL82Dialect {
    @Override
    public void contributeTypes(final TypeContributions typeContributions, final ServiceRegistry serviceRegistry) {
        super.contributeTypes(typeContributions, serviceRegistry);
        typeContributions.contributeType(new InternalPostgresUUIDType());
    }

    @Override
    protected void registerHibernateType(int code, String name) {
        super.registerHibernateType(code, name);
    }

    protected static class InternalPostgresUUIDType extends PostgresUUIDType {

        @Override
        protected boolean registerUnderJavaType() {
            return true;
        }
    }

    /**
     * Override is needed to properly support the CLOB on metadatavalue in postgres & oracle.
     * @param sqlCode
     * @return
     */
    @Override
    public SqlTypeDescriptor getSqlTypeDescriptorOverride(int sqlCode) {
        SqlTypeDescriptor descriptor;
        switch (sqlCode) {
        case Types.CLOB: {
            descriptor = LongVarcharTypeDescriptor.INSTANCE;
            break;
        }
        default: {
            descriptor = super.getSqlTypeDescriptorOverride(sqlCode);
            break;
        }
        }
        return descriptor;
    }
}