Создание совместимой таблицы соединений для hsql из устаревшего сопоставления

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 с опцией создания-удаления (для базовых модульных тестов в памяти), я получаю следующее:

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

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


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


Ответы (1)


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

person liam    schedule 22.07.2011