Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Что такое JoinTable и как с ним работать? 
:(
    Опции темы
Andrey1
Дата 2.12.2008, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 27.2.2004
Где: Moscow

Репутация: 2
Всего: 5



NetBeans генерирует Entity классы для трех таблиц и для третий, у которой ключ состоит из ключей из первых двух, он не генерирует ничего и обзывает ее JoinTable.
Получается нужно самому создавать новый класс для этой таблицы или как работать с сущностями из JoinTable?


--------------------
Созерцание и мудрость - едины. Соцерцание - это основа мудрости, а мудрость - это функция (т.е. умение использовать) созерцания.
из сутры помоста шестого патриарха Хуэйнена
PM MAIL WWW ICQ   Вверх
v2v
Дата 2.12.2008, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: 9
Всего: 56



посредством сущностей из 1й и 2й таблиц. 
в 3й таблице должны быть только связи id_1 и id_2.


--------------------
PM   Вверх
Andrey1
Дата 2.12.2008, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 27.2.2004
Где: Moscow

Репутация: 2
Всего: 5



Да, но какой объект нужно возвращать?
Ни в одном объекте нет значения, которое привязано к ключу (то есть, в третьей таблице хранятся записи: (PK1, PK2), Value ---- нужно Value)...

Это сообщение отредактировал(а) Andrey1 - 2.12.2008, 23:51


--------------------
Созерцание и мудрость - едины. Соцерцание - это основа мудрости, а мудрость - это функция (т.е. умение использовать) созерцания.
из сутры помоста шестого патриарха Хуэйнена
PM MAIL WWW ICQ   Вверх
powerOn
Дата 3.12.2008, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 28
Всего: 159



Я честно говоря не очень понял суть вопроса, но в целом, в аннотации JoinTable можно указать некоторые параметры, на основании которые будет генерироваться таблица для связи many-to-many и unidirectional one-to-many. Например можно указать как должна называться таблица, как должны именоваться колонки. Если эту аннотацию не использовать то JPA возьмет на себя дефолтное гененирование этих значений... 


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Andrey1
Дата 3.12.2008, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 27.2.2004
Где: Moscow

Репутация: 2
Всего: 5



Цитата(powerOn @  3.12.2008,  00:31 Найти цитируемый пост)
Я честно говоря не очень понял суть вопроса...

Да, наверное - не подробно описал... Сорри.

Есть таблицы, для которых NetBeans генерирует следующие Entity:

Код

...
public class Solution implements Serializable {
    @EmbeddedId
    protected SolutionPK solutionPK;

...
}

....
public class Datafield implements Serializable {

    @EmbeddedId
    protected DatafieldPK datafieldPK;
...
   @JoinTable(name = "FIELDVALUE", joinColumns = ... )
...
}



В базе еще есть таблица FIELDVALUE, для которой NetBeans ничего не генерирует. 

Ее ключ есть {SolutionPK, DatafieldPK}, и есть еще столбец Value.

Я так понимаю, что к Value нельзя обратиться на уровне объектов, потому что Value нет ни у одного из сгенерированных объектов (и быть не может).

Вопрос, как тогда работать с таблицей 'FIELDVALUE'?


--------------------
Созерцание и мудрость - едины. Соцерцание - это основа мудрости, а мудрость - это функция (т.е. умение использовать) созерцания.
из сутры помоста шестого патриарха Хуэйнена
PM MAIL WWW ICQ   Вверх
v2v
Дата 3.12.2008, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: 9
Всего: 56



а архитектуру бд менять можно?

Добавлено через 30 секунд
если в эту промежуточную таблицу добавить свой примари кэй?


--------------------
PM   Вверх
Andrey1
Дата 3.12.2008, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 27.2.2004
Где: Moscow

Репутация: 2
Всего: 5



Цитата(v2v @  3.12.2008,  11:11 Найти цитируемый пост)
если в эту промежуточную таблицу добавить свой примари кэй?

В принципе можно. 

Но архитектурно все равно могут быть данные, которые должно быть заданы для каждого Solution и каждого Datafield.

Осталось понять, как с ними работать....


--------------------
Созерцание и мудрость - едины. Соцерцание - это основа мудрости, а мудрость - это функция (т.е. умение использовать) созерцания.
из сутры помоста шестого патриарха Хуэйнена
PM MAIL WWW ICQ   Вверх
v2v
Дата 3.12.2008, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: 9
Всего: 56



в твоей задаче необходимо выделить третью сущность, поскольку хоть она и зависит от первых двух, но всё же она содержит новые данные.
Введение своего ИД и должно выделить эту сущность, а наличие двух внешних ключей из 1 и 2 таблиц будет контролировать целосность данных:
таким образом у тебя должен появится третий класс, который и будет контролировать JoinTable.


--------------------
PM   Вверх
Andrey1
Дата 3.12.2008, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 27.2.2004
Где: Moscow

Репутация: 2
Всего: 5



Нашел подробное описание проблемы в "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 (через дополнительное свойство-коллекцию в связанных таблицах).

Второе решение, похоже, проще.


Это сообщение отредактировал(а) Andrey1 - 3.12.2008, 14:52


--------------------
Созерцание и мудрость - едины. Соцерцание - это основа мудрости, а мудрость - это функция (т.е. умение использовать) созерцания.
из сутры помоста шестого патриарха Хуэйнена
PM MAIL WWW ICQ   Вверх
MisterCleric
Дата 4.12.2008, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Привет. Ребята я так и не понял в чем загвоздка у вас? 
Я так думаю все запутало то, что IDE нагенерила каких-то классов.
Я работаю под ИДЕЯ и она пока не умеет их генерить. Будет - только обрадуюсь.

У Andrey1 стоит задача ManyToMany. 
Такая связь организовуется через третью таблицу, в которой лежит ИД с обоих таблиц.
Классическая задача: юзера и роля.

Понятно, что каждый юзер может иметь несколько ролей, и обратное - одна роль может быть у нескольких юзеров.
На Java это выражается в коллекциях.

Коллекция юзеров в роле в Хайбернейт называется "бидирекшн"

отсюда выходит у нас такая архитектура:

Код

@Entity
...
public class User implements Serializable {
...
 @ManyToMany
    @JoinTable(
            name = "ROLEASSIGN",
            joinColumns = {@JoinColumn(name = "USERID")},
            inverseJoinColumns = {@JoinColumn(name = "ROLEID")}
    )
    private Set<UserRole> roles = new HashSet<UserRole>();

...

}

..............................................

@Entity
public class UserRole implements Serializable  {
...

 @ManyToMany(mappedBy = "roles")
    private Set<User> users = new HashSet<User>();

...
}


И собственно все. При назначении роли юзеру мы добавляем в коллекцию ролей новый элемент типа UserRole и вызываем на нашей сущности User persist, что положит новую запись в таблицу ROLEASSIGN.


Дальше соответсвенно по логике: надо нам работать с ROLEASSIGN(еще должны быть какие-то поля, действительно она является перзистентной, как-то участвует в нашей бизнес-логике) создаем соответствующую сущность, назначаем ей @Id(может быть композитным).
И дальше в сущности User меняем @ManyToMany на @OneToMany и мепимся на коллекцию нашей новой сущности.


ЗЫ: что-то мне помниться что это все и описано как раз в Java Persistence with Hibernate


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0475 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.