Пытаюсь разобраться с 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: помогите разобраться с заданием отношения
M>Нужно: Получить уникальный список всех OptionEntity на основании связей из Note_Option таблицы. M>Не могу сообразить можно ли это условие записать с помощью аннотаций или как вообще подойти к решению.
Аннотации они не являются аналогом запросов. Они описывают отношения и маппинг сущности на RDB. Поэтому если вы собрались использовать связь между
Option и Notes, то вам необходимо создать её в классах и описать в маппинге.
M>Варинт с @ManyToMany не совсем уместен так как пока мне не нужно знать и делать выборку для связных Option.Notes (может быть в будущем).
@JoinTable
Re[2]: JPA: помогите разобраться с заданием отношения
Здравствуйте, Blazkowicz, Вы писали:
B>Аннотации они не являются аналогом запросов. Они описывают отношения и маппинг сущности на RDB. Поэтому если вы собрались использовать связь между B> Option и Notes, то вам необходимо создать её в классах и описать в маппинге.
Это как раз то, что вводит меня в заблуждение. Связь — это же не сущность. Зачем ей класс-entitybean...
M>>Варинт с @ManyToMany не совсем уместен так как пока мне не нужно знать и делать выборку для связных Option.Notes (может быть в будущем). B>@JoinTable
Попробую поиграться и отпишусь что получилось.
Спасибо за ответ.
...все это временно... (с) Айэм
Re: JPA: помогите разобраться с заданием отношения
После некоторых экспериментов и чтения мануалов пришел к следующему:
Сущности связываются однонаправленным отношением многие ко многим, где 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: помогите разобраться с заданием отношения
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: помогите разобраться с заданием отношения
Здравствуйте, 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();
}