Как сохранить объект json с помощью hibernate?

Это моя ситуация:
У меня есть класс с атрибутом, который может быть типом json или другой структурой данных.

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

}

Я хочу сохранить этот класс с помощью hibernate, но также я хочу использовать следующий код:

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

код выше работает хорошо, но когда я пытаюсь сохранить сущность в базу данных, я получаю следующую ошибку:сопоставление имеет неправильное количество столбцов: MiClase.тип b: объект
затем я пытаюсь изменить, затем я пытаюсь изменить тип объекта de на byte[] , но не могу десериализовать экземпляр byte[] при использовании метода readValue. Какую стратегию вы мне рекомендуете в этой ситуации?
Im с помощью postgresql

1 ответ

  1. Я разочарован оценкой моего вопроса, думаю в нем есть вся логика, хотя мой английский не очень хорош, это решение помогло мне, позволяет мне сохранять любые данные в базе данных:
    Решение заключается в создании пользовательского типа:

    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 () и не использовать универсальный тип объекта