0

我的问题与数据库设计以及如何在 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中是否有更好的方法来设置注释,以便更好地理解关系并能够正确查询形状表?

谢谢你的帮助。

4

1 回答 1

1

最简单的方法是对 Shape 实体使用代理主键。这些表看起来像这样:

BLOCK (BLOCK_ID primary key, CURRENT_SHAPE_ID foreign key references SHAPE.SHAPE_ID)
SHAPE (SHAPE_ID primary key, SHAPE_VERSION, BLOCK_ID foreign key references BLOCK.BLOCK_ID)

Hibernate 不鼓励使用复合键,原因很充分(您遇到的问题只是其中之一)。

于 2011-07-07T17:23:22.640 回答