JPA: помогите разобраться с заданием отношения
От: mihauzen Украина  
Дата: 08.06.11 10:01
Оценка:
Всем привет.

Пытаюсь разобраться с JPA при работе с EJB3 entities.
Запутался в трех соснах на следующем примере.
Дано:
Таблицы Note, Option и связь между ними Note_Option.
Notes          Options       Note_Option
---------     ----------     ------------
*Note_id      *Option_id     *Note_id
 Text          Value         *Option_id

* - pk
Note_Option содержит связи на существующие записи из Notes и Options


Соответсвующие классы: NoteEntity, OptionEntity.


@Entity
@Table(name="NOTES")
public class NoteEntity ...
{
        @Id
        @Column (name = "NOTE_ID")
        private int  noteId;
..............
}

@Entity
@Table(name = "OPTIONS")
public class OptionEntity ....
{
        @Id
        @Column(name = "OPTION_ID")
        private int  optionId;
...............    
}



Нужно: Получить уникальный список всех OptionEntity на основании связей из Note_Option таблицы.

Не могу сообразить можно ли это условие записать с помощью аннотаций или как вообще подойти к решению.

Native SQL выглядит где-то так:
select distinct o.Option_id, o.Value from Options o, Note_Option where Options.Option_id = Note_Option.Option_id


Варинт с @ManyToMany не совсем уместен так как пока мне не нужно знать и делать выборку для связных Option.Notes (может быть в будущем).


Пожалуйсто помогите разобраться.
...все это временно... (с) Айэм
Re: JPA: помогите разобраться с заданием отношения
От: Blazkowicz Россия  
Дата: 08.06.11 10:08
Оценка:
Здравствуйте, mihauzen, Вы писали:


M>Нужно: Получить уникальный список всех OptionEntity на основании связей из Note_Option таблицы.

M>Не могу сообразить можно ли это условие записать с помощью аннотаций или как вообще подойти к решению.
Аннотации они не являются аналогом запросов. Они описывают отношения и маппинг сущности на RDB. Поэтому если вы собрались использовать связь между
Option и Notes, то вам необходимо создать её в классах и описать в маппинге.

M>Варинт с @ManyToMany не совсем уместен так как пока мне не нужно знать и делать выборку для связных Option.Notes (может быть в будущем).

@JoinTable
Re[2]: JPA: помогите разобраться с заданием отношения
От: mihauzen Украина  
Дата: 09.06.11 07:06
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Аннотации они не являются аналогом запросов. Они описывают отношения и маппинг сущности на RDB. Поэтому если вы собрались использовать связь между

B> Option и Notes, то вам необходимо создать её в классах и описать в маппинге.

Это как раз то, что вводит меня в заблуждение. Связь — это же не сущность. Зачем ей класс-entitybean...

M>>Варинт с @ManyToMany не совсем уместен так как пока мне не нужно знать и делать выборку для связных Option.Notes (может быть в будущем).

B>@JoinTable

Попробую поиграться и отпишусь что получилось.
Спасибо за ответ.
...все это временно... (с) Айэм
Re: JPA: помогите разобраться с заданием отношения
От: mihauzen Украина  
Дата: 21.06.11 10:01
Оценка:
Здравствуйте снова:

После некоторых экспериментов и чтения мануалов пришел к следующему:
Сущности связываются однонаправленным отношением многие ко многим, где Notes содержат уникальное множество Options.
Двунаправленным отношение делать не хочу, т.к. Options нету необходимости знать о Notes.

@Entity
@Table(name="NOTES")
public class NoteEntity ...
{
        @Id
        @Column (name = "NOTE_ID")
        private int  noteId;

        @ManyToMany(cascade={CascadeType.MERGE})
        @JoinTable
        (name="NOTE_OPTIONS", 
                   joinColumns=@JoinColumn(name="NOTE_ID"), 
                   inverseJoinColumns=@JoinColumn(name="OPTION_ID")
                   )
    private Set<OptionEntity> options;
..............
}

@Entity
@Table(name = "OPTIONS")
public class OptionEntity ....
{
        @Id
        @Column(name = "OPTION_ID")
        private int  optionId;
...............    
}


Данная схема позволяет создавать Options и связывать их с Notes автоматически создавая связи в NOTE_OPTIONS таблице.

На скорую руку попробовал решить изначальный вопрос и получить уникальный список всех OptionEntity на основании связей из Note_Option таблицы.

"SELECT n.options FROM " + NoteEntity.class.getName() + " n ORDER BY n.options.value"


Не получилось

 org.hibernate.QueryException: illegal attempt to dereference collection [noteentity0_.NOTE_ID.options] with element property reference [value] [SELECT n.options FROM datatypes.entities.NoteEntity n ORDER BY n.options.value]



Курю мануалы дальше...
...все это временно... (с) Айэм
Re[2]: JPA: помогите разобраться с заданием отношения
От: Blazkowicz Россия  
Дата: 21.06.11 10:07
Оценка: 2 (1)
Здравствуйте, mihauzen, Вы писали:


M>
M>"SELECT n.options FROM " + NoteEntity.class.getName() + " n ORDER BY n.options.value"
M>


Нельзя использовать свойство-коллекцию таким образом (.options) в HQL. Это работает только для ссылок на единственную сущность. Для коллекций (one to many, many to many) нужно явно прописывать JOIN в запросе.
Re[3]: JPA: помогите разобраться с заданием отношения
От: mihauzen Украина  
Дата: 21.06.11 13:22
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Нельзя использовать свойство-коллекцию таким образом (.options) в HQL. Это работает только для ссылок на единственную сущность. Для коллекций (one to many, many to many) нужно явно прописывать JOIN в запросе.


Спасибо
Получилось:


public List<OptionEntity> getActiveOptions(EntityManager entityManager) 
{
    Query query = entityManager.createQuery(
              "SELECT DISTINCT r FROM " + NoteEntity.class.getName() + " n, IN (n.options) r ORDER BY r.value");
    return (List<FilterOptionEntity>)query.getResultList();
}


...все это временно... (с) Айэм
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.