2016-03-24 17 views
0

私はhibernate-core 5.1.0を使用しています。フィールドのHashMapを構築するコンバータを実装しました。問題は、sessionFactoryの構築中に休止状態になっていないことです。 「AttributeConverterをインスタンス化できません」というメッセージが表示され、トレース全体が追加されました。Hibernate AttributeConverter:例外をインスタンス化できません

興味深い部分は、私がHashMapの<文字列、文字列>を拡張するクラスを作成し、コンバータ(とHibernateのエンティティクラス)で、そのクラスを使用する場合は、この例外が消えるということです。変換型でジェネリックを使用すべきでないかのように見えます。

この問題を解決する他の方法はありますか?

マイコンバータ:

@Converter(autoApply=true) 
    public class JsonKeyValueConverter implements 
       AttributeConverter<HashMap<String, String>, String> // DOESNT work 
       //AttributeConverter<ClassExtendingHashMap, String> // works 
    { 

     public String convertToDatabaseColumn(HashMap<String, String> arg0) { 
      if (arg0 == null) { 
       return null; 
      } 

      return DBUtility.GSON.toJson(arg0); 
     } 

     public KeyValueData convertToEntityAttribute(String arg0) { 
      arg0 = StringUtils.isBlank(arg0) ? null : arg0; 

      return (KeyValueData) DBUtility.GSON.fromJson(arg0, HashMap.class); 
     } 
    } 

java.lang.IllegalStateException: org.hibernate.cfgで AttributeConverter [org.labs.collab.repo.entity.conversion.JsonKeyValueConverterをインスタンス化することができません。 org.hibernate.cfgでAbstractPropertyHolder.resolveAttributeConverterDefinition(AbstractPropertyHolder.java:98) でorg.hibernate.cfg.annotations.PropertyBinder.makePropertyAndValue(PropertyBinder.java:195) org.hibernate.cfg.AnnotationBinder.processIdPropertiesIfNotAlreadyで.annotations.PropertyBinder.makePropertyValueAndBind(PropertyBinder.java:216) でorg.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:2238) (AnnotationBinder.java:963 ) でorg.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:796) でorg.hibernate.cfg.Configuration $ MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3788) org.hibernate.cfgで。コンフィグレーション$ MetadataSourceQueue.processMetadata(Configuration.java:3742) at org.hibernate.cfg.Configuration.secondPassCompile(コンフィグレーションorg.hibernate.AnnotationException: org.hibernate.cfg.AbstractPropertyHolderでAttributeConverterインスタンスを作成できませんion.java:1410) org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1844) に起因しますjava.lang.ClassCastExceptionが: sun.reflect.generics .makeAttributeConverterDefinition(AbstractPropertyHolder.java:132) org.hibernate.cfg.AbstractPropertyHolder.resolveAttributeConverterDefinition(AbstractPropertyHolder.java:95) で ... 27もっとによって引き起こされます。 reflectionObjects.ParameterizedTypeImplは になります。 org.hibernate.cfg.AttributeConverterDefinition(AttributeConverterDefinition.java:67)でjava.lang.Classにキャストできません。 org.hibernate.cfg.AbstractPropertyHolder.makeAttributeConverterDefinition(AbstractPropertyHolder.java:129) ... 28もっと

おかげで !

答えて

1

あなたは正しいです、残念ながら、AttributeConverterは、パラメトリックタイプ(ジェネリック)では動作しませんので、最も簡単な方法は、使用することです。

@Converter(autoApply=true) 
public class JsonKeyValueConverter implements 
      AttributeConverter<HashMap, String> { 

それはあなたがオーバーライドされたメソッド内に直接HashMap<String, String>を使用することができます。

関連する問題