从旧映射为 hsql 生成兼容的连接表

Posted

技术标签:

【中文标题】从旧映射为 hsql 生成兼容的连接表【英文标题】:Generating a compatible join table for hsql from a legacy mapping 【发布时间】:2011-04-08 00:21:11 【问题描述】:
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();

这适用于旧数据库,但是当我通过带有 create-drop 选项的 hsqldb 运行这些带注释的类时(用于基本的内存单元测试),我得到以下信息:

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

所以我检查了 SchemaExport,hibernate 实际上正在生成带有用于映射的连接表的 DB Schema,但它不包括 mapping_type_id 字段。如何使架构与架构的其余部分一起生成它而不干扰在现有数据库上运行的代码?

【问题讨论】:

【参考方案1】:

这个问题的答案是创建一个嵌入式 ID 并使用它通过表映射类,而不是使用连接表语法。如果连接表有 row-id,这更容易伪造,否则,使用 @Embeddable 和 @EmbeddedId 可以使其工作。

【讨论】:

以上是关于从旧映射为 hsql 生成兼容的连接表的主要内容,如果未能解决你的问题,请参考以下文章

从旧样式更改为新样式与单独的表连接

使用java的hsql数据库连接

从单元测试连接时,HSQL 立即关闭连接

HSQL - 识别打开连接的数量

NHibernate生成实体类xml映射文件

HSQL 中无法识别交叉连接