Аннотации Hibernate с устаревшей таблицей сопоставления

Я пытаюсь преобразовать часть уровня доступа к данным в режим гибернации и столкнулся с некоторыми проблемами при правильной ассоциации коллекции. Я использую аннотации гибернации и имею две связанные сущности (здесь работает базовая конфигурация, но не соединение). Некоторые имена были запутаны:

Spring 3, Hibernate 3, Java 6, MySQL 5.

Контейнер имеет список видео. Оба этих класса отображаются в спящем режиме с аннотациями.

К сожалению, таблица сопоставления имеет необычную схему. Это выглядит так:

container_mapping:
+-----------------+------------------+------+-----+-------------------+-------+
| Field           | Type             | Null | Key | Default           | Extra |
+-----------------+------------------+------+-----+-------------------+-------+
| internal_id     | int(10) unsigned | NO   | PRI |                   |       |
| external_id     | varchar(255)     | NO   | PRI |                   |       |
| mapping_type_id | int(4) unsigned  | NO   | PRI |                   |       |
| creation_date   | timestamp        | NO   |     | CURRENT_TIMESTAMP |       |
+-----------------+------------------+------+-----+-------------------+-------+

internal_id сопоставляется с container.id, а external_id сопоставляется с video.id, когда mapping_type_id = 2

Запрос для возврата по id:

select * from container c, container_mapping cm, video v where cm.mapping_type_id=2 and c.episode_id = cm.internal_id and cm.external_id = v.id and c.episode_id=?;

Кажется, я не могу найти хороший пример объединения коллекции с полем соединения, имеющим определенное значение. В этот момент я хватаюсь за соломинку. (неполная) версия здесь:

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
@JoinTable(name="container_mapping",
        joinColumns = @JoinColumn(name="external_id"))
private List<Video> videos = Lists.newArrayList();

У кого-нибудь есть какие-нибудь указания о том, как действовать?


person liam    schedule 24.03.2011    source источник


Ответы (1)


Вы можете попробовать сопоставить коллекцию видео таким образом:

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
@JoinTable(name="container_mapping",
     joinColumns = @JoinColumn(name="internal_id"),
     inverseJoinColumns = @JoinColumn(name="external_id")
@WhereJoinTable(clause="mapping_type_id=2")
private List<Video> videos = Lists.newArrayList();

Идея этого сопоставления следующая:

  1. Параметр joinColumns аннотации @JoinTable используется для настройки столбца, в котором хранится значение идентификатора контейнера.
  2. Столбец, в котором хранится идентификатор видео, настраивается с помощью параметра inverseJoinColumns аннотации @JoinTable.
  3. Аннотацию @WhereJoinTable можно использовать для ограничения строк, выбранных из таблицы соединений. Параметр предложения должен быть записан с использованием SQL. В этом случае он используется для ограничения значения mapping_type_id, которое должно быть равно 2.
person pkainulainen    schedule 24.03.2011
comment
Аааа, я раньше не видел аннотацию @WhereJoinTable. Потрясающий! Раньше у меня была InverseJoinColumn, но я удалил ее, потому что мне казалось, что я хватаюсь за соломинку. Я попробую. - person liam; 25.03.2011