我的问题与数据库设计以及如何在 Hibernate 中对该设计进行建模有关。我有两个具有以下主键的表:
BLOCK (BLOCK_ID)
BLOCK_SHP (BLOCK_ID, SHAPE_VERSION)
BLOCK 到 BLOCK_SHP 是一对多的关系,因为单个块可以具有与其关联的许多不同版本的形状。到现在为止还挺好。
第二个关联是我还希望能够获得 Block 的当前形状。为此,我在 BLOCK 表中添加了另一个属性:
CUR_SHAPE_VERSION
BLOCK_ID 和 CUR_SHAPE_VERSION 现在形成 BLOCK_SHP 表 BLOCK_ID SHAPE_VERSION 的外键。每个块可能有 0 或 1 个当前形状。
在 Hibernate 中,我通过以下方式设置了第二个关联:
@OneToOne(级联 = CascadeType.ALL,可选 = true ) @NotFound( 动作 = NotFoundAction.IGNORE ) @JoinColumns( { @JoinColumn(name = "BLOCK_ID", referencedColumnName = "BLOCK_ID", insertable = false, updatable = false), @JoinColumn(名称=“CUR_SHAPE_VERSION”,referencedColumnName =“SHAPE_VERSION”,可插入=假,可更新=假)}) 公共块形状 getCurrentShape() { 返回当前形状; }
@NotFound 注释是必需的,因为 Hibernate 在处理可为空的一对一关联时遇到问题。如果它没有找到关联,它会忽略它而不是抛出错误。
但这对我来说并不是很满意,因为这意味着 Hibernate 并没有真正意识到实体之间的正确关系。例如,如果我查询currentShape is not null,Hibernate 不知道如何正确执行此查询 - 它正在查询block_id is not null 或 cur_shape_version is not null。
所以我想我有几个问题。首先,有没有更好的方法在数据库中对第二个关联进行建模?其次,Hibernate中是否有更好的方法来设置注释,以便更好地理解关系并能够正确查询形状表?
谢谢你的帮助。