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实际上生成了带有映射连接表的DB Schema,但它不包括mapping_type_id字段。如何使用的其余模式使模式生成此模式而不干扰在现有数据库上运行的代码?
答案 0 :(得分:0)
答案是创建一个嵌入式ID,并使用它来通过表映射类,而不是使用连接表语法。如果连接表有行id,这更容易伪造,但是否则,使用@Embeddable和@EmbeddedId可以使它工作。