2012-12-24 11 views
1

Я использую db4o 8.0 с прозрачной активацией/постоянством ... У меня есть класс, который содержит EnumSet (и другие вещи). Я создаю экземпляр, добавляю значение перечисления в множество и сохраняю. Когда я ищу в БД, получить его и пытается активировать объект, я получаю это исключение:db4o enumset exception

Exception in thread "main" java.lang.ClassCastException: class Resources.Enums$fooEnum_t != null 
    at java.util.EnumSet.typeCheck(EnumSet.java:380) 
    at java.util.RegularEnumSet.add(RegularEnumSet.java:160) 
    at java.util.RegularEnumSet.add(RegularEnumSet.java:36) 
    at com.db4o.typehandlers.CollectionTypeHandler.addToCollection(CollectionTypeHandler.java:120) 
    at com.db4o.typehandlers.CollectionTypeHandler.activate(CollectionTypeHandler.java:45) 
    at com.db4o.internal.Handlers4.activate(Handlers4.java:300) 
... 
... 

Для хранения enumSet в db4o я использую:

config.common().objectClass(EnumSet.class).translate(new com.db4o.config.TSerializable()); 

Я не могу понять, в чем проблема является. Есть идеи?

EDIT:
Я не знаю, где задавать вопросы о db4o. Сообщество SO не выглядит очень активным в отношении db4o. Это потому, что db4o не очень популярен или есть другое место для «поддержки»?

EDIT 2:
Я обнаружил, что пост на форуме VERSANT, который может иметь отношение, но не помогает: http://community.versant.com/Forums/tabid/98/aft/1046/Default.aspx#3370

я узнал еще одну вещь. Нет встроенной поддержки java.util.EnumMap и java.util.EnumSet, db4o будет генерировать исключение , потому что не существует конструктора по умолчанию, и все конструкторы с нулевыми аргументами будут терпеть неудачу для этих классов. Db4o.configure(). ObjectClass ("java.util.EnumMap"). Translate (новый com.db4o.config.TSerializable()) решит проблему, конечно. Я думаю, что стандартная структура коллекции должна поддерживаться.

ответ

1

Я даже был бы осторожен с использованием перечислений в db4o. Способ, которым db4o хранит перечисление, чрезвычайно опасен. В случае, если вы рефакторинг, измените перечисление, это может привести к супер странному поведению, ошибкам при сохранении этого перечисления в db4o. До сих пор, что операторы switch на перечислениях могут переходить в неправильное место.

Краткая причина: db4o хранит перечисления как экземпляр объекта и устанавливает значения enum на отражение при загрузке, это может привести к чрезвычайно странным ошибкам, так как переименование не должно изменяться.

Я бы избегал хранения (Java) -enums и, следовательно, также перечисления.

+0

Спасибо за ответ! У меня здесь ситуация ... Мой проект полон перечислений, и это очень сложно изменить или обрабатывать вещи без перечислений. Здесь я должен найти хак. Могу ли я каким-то образом использовать переводчиков и сохранить перечисления как строки? – ApollonDigital

+0

После того, как вы потратили достаточно времени на учебники и поиски о db4o, я чувствую, что есть много ошибок и плохих проектов. Я не уверен даже в том, насколько активен проект. Иногда я думаю, что я должен начать искать что-то лучше, но я не знаю, есть ли хорошие альтернативы. Решения Sql на низком уровне и очень строго определены, а oodbs не так популярны и хорошо разработаны ... Базы данных такие беспорядок: p – ApollonDigital

+0

Вы нашли решение с db4o? Потому что у меня такая же проблема. – rob

 Смежные вопросы

  • Нет связанных вопросов^_^