Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: Общие вопросы > Маппинг generic коллекций (Hibernate) |
Автор: INlHELL 14.1.2010, 14:07 | ||||||
Всем доброго времени суток! Столкнулся со следующей проблемой, в упрощённом виде выглядет так: есть класс First и есть класс Second никак не связанный с First. Необходимо создать "универсалный контейнер" для хранения наборов этих объектов. Т.е. generic класс с коллекцией, который принимает объекты обоих типов, помещает их в коллекцию и сохраняет в БД. Ниже классы тестового приложения:
Самое интересное, контейнер:
Как можно обойти следующие анотации: @CollectionOfElements @OneToMany(targetEntity = First.class) В таком виде пример зарускается и данные вносятся в таблицы, но коллекция только для класса First и при попытке добавления экземпляра класса Second, появляются эксепшены. Активное "гугление" не помогло, есть мысль использовать супер класс и в качестве targetEntity указывать его, но для этого необзодима маппить и его и данное решение мне кажется несовсем верным. Буду очень признателен за любую помощь! |
Автор: afon 14.1.2010, 17:48 |
Накатал большую телегу по мапингу с наследованием и связями, но передумал. 1) На сколько сильно НИКАК НЕ СВЯЗАНЫ First и Second? 2) Сохраняется ли объект Container в базу? 3) имеет ли Container какую-то связь с First и Second? Если 1) Сильно 2) нет, 3) нет - то храни их как хочешь, при любых раскладах будет щастье, выдергиваешь нужный List<First> или List<Second> запросом и суешь в свой Контейнер. Если 1) Есть общие поля 2) да 3) да - то выложу свою телегу ![]() |
Автор: LSD 14.1.2010, 18:25 |
А как ты это у тебя в базе представлено? У тебя одна колонка содержит айдишники из двух разных таблиц? |
Автор: INlHELL 14.1.2010, 18:26 | ||||||||
Собственно вообще никак не связаны, т.е. это две независимые сущности.
Сохраняется, ниже приведу код с тестовым приложением для этих классов.
Не имеет и имеет не должен, в идеале (в конченом приложении) существует множество объектов не связанных иерархией наследования и другими связями (имею ввиду экземпляр одного объекта не содержит ссылок на экземпляр другого). И есть объект (Container) в который можно передать набор (в примере Collection) этих объектов. Главное, что Container должен принимать коллекцию любого типа (Firtst и Second в данном примере) и ничего "не знает" о них. Код использующий эти классы (не догадался, надо было сразу выложить):
Прошу прощения, что сразу не уточнил и за неказистость кода тоже, это исключительно тестовое приложение. Буду благодарен за любой совет или мысль, как это можно реализовать. |
Автор: INlHELL 14.1.2010, 18:43 | ||||
В предыдущем блоке кода скопировал две строки не те:
Правильно конечно так:
http://floomby.com/content/l61SvMJu1U/ вот такая. |
Автор: LSD 14.1.2010, 18:50 |
Прикрепи картинку к посту. У меня этот сайт заблокирован. |
Автор: afon 14.1.2010, 19:44 | ||
В общем, похоже, что решение с collectionOfElements очень даже удачное для коллекций любых никак не связанных объектов. Меня только смущает, что
и в тоже время оба First и Second имеют одинаковые поля uuis и name. Но это наверное для простоты и просто совпадение. В любом случае, твой варинат работает, но возможны и другие. Например, можно отэкстендить каждый элемент от какого-нибудь пустого интерфейса, допустим, interface MyStorableCollectionItem, в свой Container прописать Collection<? extends MyStorableCollectionItem> и всех делов. Когда будешь поднимать конкретный Container из базы, всегда можно будет взять instanceof объектов, которые будут в листе. Тут вроде просто. Другие варианты могут базироваться на http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#d0e829, но они дадут свои ограничения. Например, расшаренные строчные id у всех реализаторов MyStorableCollectionItem, или общий пул числовых id. Мне кажется, что изначальный вариант с collectionOfElements, который реализует данную ситуацию всего в одну таблицу, самый подходящий. |