Hibernate AttributeConverter 可支持的最小 Number 转换

本文介绍了在使用Hibernate的AttributeConverter时,如何进行JDBC类型映射,并详细探讨了支持的最小Number转换。内容涵盖了JDBC类型映射方法和映射表,特别是最小数字类型转换的实践应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

版本:org.hibernate:hibernate-core:5.4.3.Final
源码:org.hibernate.type.descriptor.sql.JdbcTypeJavaClassMappings

JDBC 类型映射方法

/**
 * For the given Java type, determine the JDBC recommended JDBC type.
 *
 * This includes the mappings defined in <i>TABLE B-2 - Java Types Mapped to JDBC Types</i> as well as some additional "common sense" mappings for things like BigDecimal, BigInteger, etc.
 */
public int determineJdbcTypeCodeForJavaClass(Class cls) {
	Integer typeCode = javaClassToJdbcTypeCodeMap.get(cls);
	if (typeCode != null) {
		return typeCode;
	}

	int specialCode = cls.hashCode();
	log.debug("JDBC type code mapping not known for class [" + cls.getName() + "]; using custom code [" + specialCode + "]");
	return specialCode;
}

JDBC 类型映射表

private static ConcurrentHashMap<Class, Integer> buildJavaClassToJdbcTypeCodeMappings() {
	final ConcurrentHashMap<Class, Integer> workMap = new ConcurrentHashMap<>();

	// these mappings are the ones outlined specifically in the spec
	workMap.put(String.class, Types.VARCHAR);
	workMap.put(BigDecimal.class, Types.NUMERIC);
	workMap.put(BigInteger.class, Types.NUMERIC);
	workMap.put(Boolean.class, Types.BIT);
	workMap.put(Short.class, Types.SMALLINT);
	workMap.put(Integer.class, Types.INTEGER);
	workMap.put(Long.class, Types.BIGINT);
	workMap.put(Float.class, Types.REAL);
	workMap.put(Double.class, Types.DOUBLE);
	workMap.put(byte[].class, Types.LONGVARBINARY);
	workMap.put(java.sql.Date.class, Types.DATE);
	workMap.put(Time.class, Types.TIME);
	workMap.put(Timestamp.class, Types.TIMESTAMP);
	workMap.put(Blob.class, Types.BLOB);
	workMap.put(Clob.class, Types.CLOB);
	workMap.put(Array.class, Types.ARRAY);
	workMap.put(Struct.class, Types.STRUCT);
	workMap.put(Ref.class, Types.REF);
	workMap.put(Class.class, Types.JAVA_OBJECT);
	workMap.put(RowId.class, Types.ROWID);
	workMap.put(SQLXML.class, Types.SQLXML);

	// additional "common sense" registrations
	workMap.put(Character.class, Types.CHAR);
	workMap.put(char[].class, Types.VARCHAR);
	workMap.put(Character[].class, Types.VARCHAR);
	workMap.put(Byte[].class, Types.LONGVARBINARY);
	workMap.put(java.util.Date.class, Types.TIMESTAMP);
	workMap.put(Calendar.class, Types.TIMESTAMP);

	return workMap;
}

可支持的最小 Number 转换

String转换Number时,可支持的最小类型转换为AttributeConverter<String, Short>

import javax.persistence.AttributeConverter;

/**
 * Converter - 字符串转换数字
 */
public class StringToNumberConverter implements AttributeConverter<String, Short> {

    @Override
    public Short convertToDatabaseColumn(String attribute) {
        return attribute != null ? Short.valueOf(attribute) : null;
    }

    @Override
    public String convertToEntityAttribute(Short dbData) {
        return dbData != null ? dbData.toString() : null;
    }

}

(完)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值