| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java EE (J2EE) и Spring > Что такое JoinTable и как с ним работать? |
| Автор: Andrey1 2.12.2008, 22:19 |
| NetBeans генерирует Entity классы для трех таблиц и для третий, у которой ключ состоит из ключей из первых двух, он не генерирует ничего и обзывает ее JoinTable. Получается нужно самому создавать новый класс для этой таблицы или как работать с сущностями из JoinTable? |
| Автор: v2v 2.12.2008, 23:24 |
| посредством сущностей из 1й и 2й таблиц. в 3й таблице должны быть только связи id_1 и id_2. |
| Автор: Andrey1 2.12.2008, 23:50 |
| Да, но какой объект нужно возвращать? Ни в одном объекте нет значения, которое привязано к ключу (то есть, в третьей таблице хранятся записи: (PK1, PK2), Value ---- нужно Value)... |
| Автор: powerOn 3.12.2008, 00:31 |
| Я честно говоря не очень понял суть вопроса, но в целом, в аннотации JoinTable можно указать некоторые параметры, на основании которые будет генерироваться таблица для связи many-to-many и unidirectional one-to-many. Например можно указать как должна называться таблица, как должны именоваться колонки. Если эту аннотацию не использовать то JPA возьмет на себя дефолтное гененирование этих значений... |
| Автор: Andrey1 3.12.2008, 11:01 | ||
Да, наверное - не подробно описал... Сорри. Есть таблицы, для которых NetBeans генерирует следующие Entity:
В базе еще есть таблица FIELDVALUE, для которой NetBeans ничего не генерирует. Ее ключ есть {SolutionPK, DatafieldPK}, и есть еще столбец Value. Я так понимаю, что к Value нельзя обратиться на уровне объектов, потому что Value нет ни у одного из сгенерированных объектов (и быть не может). Вопрос, как тогда работать с таблицей 'FIELDVALUE'? |
| Автор: v2v 3.12.2008, 11:11 |
| а архитектуру бд менять можно? Добавлено через 30 секунд если в эту промежуточную таблицу добавить свой примари кэй? |
| Автор: Andrey1 3.12.2008, 11:56 |
В принципе можно. Но архитектурно все равно могут быть данные, которые должно быть заданы для каждого Solution и каждого Datafield. Осталось понять, как с ними работать.... |
| Автор: v2v 3.12.2008, 14:41 |
| в твоей задаче необходимо выделить третью сущность, поскольку хоть она и зависит от первых двух, но всё же она содержит новые данные. Введение своего ИД и должно выделить эту сущность, а наличие двух внешних ключей из 1 и 2 таблиц будет контролировать целосность данных: таким образом у тебя должен появится третий класс, который и будет контролировать JoinTable. |
| Автор: Andrey1 3.12.2008, 14:52 |
| Нашел подробное описание проблемы в "Java Persistence with Hibernate (2007)", секция 7.2.3. Есть два решения: * an intermediate entity class for the join table (через новую вспомогательную сущность). * mapping the join table to a collection of components (через дополнительное свойство-коллекцию в связанных таблицах). Второе решение, похоже, проще. |
| Автор: MisterCleric 4.12.2008, 10:36 | ||
| Привет. Ребята я так и не понял в чем загвоздка у вас? Я так думаю все запутало то, что IDE нагенерила каких-то классов. Я работаю под ИДЕЯ и она пока не умеет их генерить. Будет - только обрадуюсь. У Andrey1 стоит задача ManyToMany. Такая связь организовуется через третью таблицу, в которой лежит ИД с обоих таблиц. Классическая задача: юзера и роля. Понятно, что каждый юзер может иметь несколько ролей, и обратное - одна роль может быть у нескольких юзеров. На Java это выражается в коллекциях. Коллекция юзеров в роле в Хайбернейт называется "бидирекшн" отсюда выходит у нас такая архитектура:
И собственно все. При назначении роли юзеру мы добавляем в коллекцию ролей новый элемент типа UserRole и вызываем на нашей сущности User persist, что положит новую запись в таблицу ROLEASSIGN. Дальше соответсвенно по логике: надо нам работать с ROLEASSIGN(еще должны быть какие-то поля, действительно она является перзистентной, как-то участвует в нашей бизнес-логике) создаем соответствующую сущность, назначаем ей @Id(может быть композитным). И дальше в сущности User меняем @ManyToMany на @OneToMany и мепимся на коллекцию нашей новой сущности. ЗЫ: что-то мне помниться что это все и описано как раз в Java Persistence with Hibernate |