Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Цитата(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'?

Автор: v2v 3.12.2008, 11:11
а архитектуру бд менять можно?

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

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

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

Но архитектурно все равно могут быть данные, которые должно быть заданы для каждого 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 это выражается в коллекциях.

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

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

Код

@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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)