Get StandardServiceRegistry from UserType

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

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;
  }
}

Yes, was just about to suggest you the same thing. That’s the way to go.

1 Like