Как сохранить HashMap с Hibernate - PullRequest
       8

Как сохранить HashMap с Hibernate

4 голосов
/ 15 января 2011

Здравствуйте, я очень новичок в спящем мире и, похоже, преодолел препятствия. Объект, который мне нужно сохранить, содержит хэш-карту.

private Map<String, SentimentFrequencyCounts> modelData = null;

Дело в том, что мне никогда не понадобится искать, сортировать или делать что-либо с этой картой. Мне просто нужно сохранить ее вместе с объектом и загрузить при загрузке объекта, поэтому я надеялся, что есть какой-то способ, которым Hibernate может просто сериализует его, а затем сохраняет его в поле CLOB или BLOB, но я не могу найти какой-либо способ сделать это.

Итак, я попытался в спящем режиме сохранить это, например,

    @OneToMany(mappedBy="ngram_data", fetch = FetchType.EAGER) 
 @MapKey(name = "attributeName") 
 public Map<String, SentimentFrequencyCounts> getModelData() {
  return modelData;
 }

Но это дает мне следующее исключение во время выполнения org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class:

Класс SentimentFrequencyCounts является внутренним классом класса, который я пытаюсь сохранить. В общем, я думаю, что я действительно не понимаю, как работает Hibernate для hashmap. Действительно позор, я не могу просто заставить это сериализовать это и объединить это в единственном столбце.

Заранее спасибо за помощь и время.

Ответы [ 2 ]

2 голосов
/ 31 мая 2012
@org.hibernate.annotations.Type(
        type = "org.hibernate.type.SerializableToBlobType", 
        parameters = { @Parameter( name = "classname", value = "java.util.HashMap" ) }
)
public Map<String, SentimentFrequencyCounts> getModelData() {
  return modelData;
}

Или даже просто это будет работать в большинстве случаев (распределенное кэширование может быть проблемой):

@org.hibernate.annotations.Type( type = "org.hibernate.type.SerializableType" )
public Map<String, SentimentFrequencyCounts> getModelData() {
  return modelData;
}
1 голос
/ 15 января 2011

Снимите существующие аннотации и аннотируйте список с помощью @Lob - это указывает, что постоянное свойство или поле должны сохраняться как большой объект для поддерживаемого базой данных большого объекта типа .

Если тип переменной был подтипом Serializable, вы можете просто полностью исключить аннотации; Правила JPA для сопоставлений по умолчанию гласят, что типы, которые являются Сериализуемыми, а не примитивными или Embeddable, сериализуются и хранятся в столбцах BLOB. Тем не менее, List не Serializable, хотя ArrayList и.

Вы можете использовать @Lob с @ElementCollection, но я не уверен, каков будет результат; я не знаю, сериализует ли это весь список или создает таблицу, в которой каждый элемент списка сериализуется отдельно. Это, вероятно, вас не интересует в любом случае.

МНОГО ПОСЛЕДНЕГО РЕДАКТИРОВАНИЯ: Конечно, как известно старательному исследователю спецификации, эта аннотация работает только для полей с сериализуемым типом , а не с полями, которые просто содержат объекты сериализуемого класс . Следовательно, чтобы сделать эту работу, вам придется заниматься махинациями. Я посмотрел, можно ли сделать что-то умное с универсальным подстановочным знаком, ограниченным типом пересечения, но я не думаю, что вы можете. Вы можете, однако, написать небольшой класс, подобный этому:

class SerializableInstanceOf<T> implements Serializable {
    public final T instance;

    public SerializableInstanceOf(T instance) {
        Serializable s = (Serializable)instance;
        this.instance = instance;
    }
}

И использовать это как держатель для списка - у сущности есть поле этого типа, помеченное @Lob, и содержит ссылку на список в нем. Каждый раз, когда вы хотите работать со списком, вы проходите через поле экземпляра, возможно, через метод getList для объекта.

Это некрасиво, но оно должно позволить тебе делать то, что тебе нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...