boutss
1
Hi,
I want to retrieve the instance of the JDBCTYPE class from the BeanManagerService. But I can’t access the StandardRegistry from a UserType
- How implement get StandardServiceRegistry() in commentaire?
For the information the idea is to get the annotation JDBCTYPE on the field for give the correct type SQL to UserType.
- Maybe an another solution for do this?
Thank you.
public class EnumTypeHibernate implements UserType<EnumType>, DynamicParameterizedType {
private int sqlType = SqlTypes.INTEGER;
private Class<? extends EnumType> enumere;
@Override
public void setParameterValues(Properties parameters) {
String typeEnumere = parameters.getProperty(DynamicParameterizedType.RETURNED_CLASS);
enumere = (Class<? extends EnumType>) ClassUtils.forNameSafe(typeEnumere);
ParameterType reader = (ParameterType) parameters.get(PARAMETER_TYPE);
JdbcType jdbcTypeClass = AnnotationUtils.getAnnotation(reader.getAnnotationsMethod(), JdbcType.class);
if (jdbcTypeClass != null) {
Class<? extends org.hibernate.type.descriptor.jdbc.JdbcType> jdbTypeClass = jdbcTypeClass.value();
// sqlType = getStandardServiceRegistry().getService(ManagedBeanRegistry.class).getBean(jdbcTypeClass.class).getBeanInstance().getJdbcTypeCode();
}
}
@Override
public int getSqlType() {
return sqlType;
}
Knowing that I’m in the SessionFactoryBuilder
boutss
2
I have a solution but i use a deprecated method…typeConfiguration.getServiceRegistry()
with the interface TypeConfigurationAware
.
package com.efluid.hibernate.type;
...
public class EnumTypeHibernate implements UserType<EnumType>, DynamicParameterizedType, TypeConfigurationAware {
private org.hibernate.type.descriptor.jdbc.JdbcType jdbcType = IntegerJdbcType.INSTANCE;
private Class<? extends EnumType> enumere;
private TypeConfiguration typeConfiguration;
@Override
public void setParameterValues(Properties parameters) {
String typeEnumere = parameters.getProperty(DynamicParameterizedType.RETURNED_CLASS);
enumere = (Class<? extends EnumType>) ClassUtils.forNameSafe(typeEnumere);
ParameterType reader = (ParameterType) parameters.get(PARAMETER_TYPE);
JdbcType jdbcTypeAnnotation = AnnotationUtils.getAnnotation(reader.getAnnotationsMethod(), JdbcType.class);
if (jdbcTypeAnnotation != null) {
Class<? extends org.hibernate.type.descriptor.jdbc.JdbcType> jdbTypeClass = jdbcTypeAnnotation.value();
jdbcType = typeConfiguration.getServiceRegistry().getService(ManagedBeanRegistry.class).getBean(jdbTypeClass).getBeanInstance();
}
}
@Override
public int getSqlType() {
return jdbcType.getJdbcTypeCode();
}
@Override
public Class<EnumType> returnedClass() {
return EnumType.class;
}
@Override
public boolean equals(EnumType x, EnumType y) {
return Objects.equals(x, y);
}
@Override
public int hashCode(EnumType x) {
return Objects.hashCode(x);
}
@Override
public EnumType nullSafeGet(ResultSet rs, int position, SharedSessionContractImplementor session, Object owner) throws SQLException {
int valeurEnumere = rs.getInt(position);
return rs.wasNull() ? null : EnumerationService.instance().find(enumere, valeurEnumere);
}
@Override
public void nullSafeSet(PreparedStatement st, EnumType value, int index, SharedSessionContractImplementor session) throws SQLException {
if (value != null) {
st.setInt(index, value.getValue());
} else {
st.setNull(index, Types.INTEGER);
}
}
@Override
public EnumType deepCopy(EnumType value) {
return value;
}
@Override
public boolean isMutable() {
return false;
}
@Override
public Serializable disassemble(EnumType value) {
return deepCopy(value);
}
@Override
public EnumType assemble(Serializable cached, Object owner) {
return deepCopy((EnumType) cached);
}
@Override
public org.hibernate.type.descriptor.jdbc.JdbcType getJdbcType(TypeConfiguration typeConfiguration) {
return jdbcType;
}
@Override
public TypeConfiguration getTypeConfiguration() {
return typeConfiguration;
}
@Override
public void setTypeConfiguration(TypeConfiguration typeConfiguration) {
this.typeConfiguration = typeConfiguration;
}
}
beikov
3
Yes, was just about to suggest you the same thing. That’s the way to go.
1 Like