Создание совместимой таблицы соединений для hsql из унаследованного отображения - PullRequest
0 голосов
/ 08 апреля 2011
Given this schema:
+-----------------+------------------+------+-----+-------------------+-------+
| 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 |       |
+-----------------+------------------+------+-----+-------------------+-------+

И эта аннотация:

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

, которая прекрасно работает с устаревшей базой данных, но когда я запускаю эти аннотированные классы через hsqldb с опцией create-drop (для базовых модульных тестов в памяти)), Я получаю следующее:

[elided]
Caused by: java.sql.SQLException: Column not found: VIDEOS0_.MAPPING_TYPE_ID in statement 
[elided]

Итак, я проверил с помощью SchemaExport, и hibernate фактически генерирует схему БД с таблицей соединений для отображения, но она не включает поле mapping_type_id.Как заставить схему сгенерировать это с остальной частью схемы без вмешательства в код, который выполняется в существующей базе данных?

1 Ответ

0 голосов
/ 23 июля 2011

Ответ заключается в создании встроенного идентификатора и его использовании для сопоставления класса через таблицу вместо использования синтаксиса объединяющей таблицы.Это легче подделать, если у объединяющей таблицы есть идентификатор строки, но в противном случае использование @Embeddable и @EmbeddedId может заставить его работать.

...