2016-04-30 6 views
0

これは私の状況です: json型または別のデータ構造にすることができる属性を持つクラスがあります。hibernateを使ってjsonオブジェクトを永続化する方法はありますか?

public class MiClase { 
private int a; 
private Object b; 
//Get and Set method 

}

私は休止状態を使用して、このクラスを永続化したいが、また、私は次のコードを使用したい:

ObjectMapper m=new ObjectMapper(); 
m.readValue(json, new TypeReference<MiClase>() { 
      }); 

作業罰金上記のコードが、私は、エンティティを保存しようとすると、マッピングに間違った数の列があります:MiClase.bタイプ:オブジェクト 次に、私はオブジェクトタイプをバイト[]に変更しようとしますが、readValueを使用するとバイト[]のインスタンスを逆シリアル化できません方法。あなたはこの状況で私にどのような戦略をお勧めしますか? 私はpostgresqlを使用しています

答えて

0

私の質問の評価には失望していますが、私の英語はあまり良くはありませんが、すべての論理があると思います。この解決策は私に役立ちました。 ソリューションは、カスタムタイプを作成することです:

public class JacksonUserType implements UserType { 

    private static final int[] SQL_TYPES = { Types.LONGVARCHAR }; 

    @Override 
    public boolean equals(Object x, Object y) throws HibernateException { 
     if (x == y) { 
      return true; 
     } else if (x == null || y == null) { 
      return false; 
     } else { 
      return x.equals(y); 
     } 
    } 

    @Override 
    public int hashCode(Object x) throws HibernateException { 
     return null == x ? 0 : x.hashCode(); 
    } 

    @Override 
    public boolean isMutable() { 
     return true; 
    } 

    @Override 
    public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor session) throws HibernateException, SQLException { 
     if (value == null) { 
      st.setString(index, null); 
     } else { 
      st.setString(index, convertObjectToJson(value)); 
     } 
    } 

    @Override 
    public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner) throws HibernateException, SQLException { 
     String content = rs.getString(names[0]); 
     if(content!=null){ 
      return convertJsonToObject(content); 
     } 
     return null; 
    } 

    Object convertJsonToObject(String content){ 
     try { 
      ObjectMapper mapper = new ObjectMapper(); 
      JavaType type = createJavaType(mapper); 
      return mapper.readValue(content, type); 
     } catch (IOException e) { 
      throw new RuntimeException(e); 
     } 
    } 

    String convertObjectToJson(Object object){ 
     try { 
      ObjectMapper mapper = new ObjectMapper(); 
      mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); 
      return mapper.writeValueAsString(object); 
     } catch (IOException e) { 
      throw new RuntimeException(e); 
     } 
    } 

    @Override 
    public Object deepCopy(Object value) throws HibernateException { 
     String json = convertObjectToJson(value); 
     return convertJsonToObject(json); 
    } 

    /** 
    * Optionnal 
    */ 
    @Override 
    public Object replace(Object original, Object target, Object owner) 
      throws HibernateException { 
     return deepCopy(original); 
    } 

    /** 
    * (optional operation) 
    * 
    * @param value 
    * 
    * @throws HibernateException 
    */ 
    @Override 
    public Serializable disassemble(Object value) throws HibernateException { 
     return (Serializable) deepCopy(value); 
    } 

    /** 
    * (optional operation) 
    * 
    * @param cached 
    * @param owner 
    * 
    * @return the instance cached 
    * 
    * @throws HibernateException 
    */ 
    @Override 
    public Object assemble(Serializable cached, Object owner) 
      throws HibernateException { 
     return deepCopy(cached); 
    } 

    /** 
    * By default we are expecting to use a simple object/not a collection (Set, List) 
    * 
    * @param mapper : instance jackson object mapper 
    * 
    * @return A jackson JavaType to specify wich object represent the json string representation 
    * 
    */ 
    public JavaType createJavaType (ObjectMapper mapper){ 
     return SimpleType.construct(returnedClass()); 
    } 


    @Override 
    public int[] sqlTypes() { 
     return SQL_TYPES; 
    } 

    @Override 
    public Class returnedClass() { 
     return Object.class; 
    } 
} 

あなたはまた、抽象メソッドと抽象クラスのバリアントを使用することができます。一般的なオブジェクトタイプ

を使用returnedClass()とではありません
関連する問題