hibernate中的多个连接关联

时间:2011-07-07 17:12:22

标签: database hibernate database-design hibernate-annotations

我的问题与数据库设计有关,也与Hibernate中的设计建模有关。我有两个表,其中包含以下主键:

BLOCK (BLOCK_ID)
BLOCK_SHP (BLOCK_ID, SHAPE_VERSION)

BLOCK到BLOCK_SHP是一对多关系,因为单个块可以有许多与之关联的不同版本化形状。到目前为止一切都很好。

第二个关联是我还希望能够获得Block的当前形状。为此,我在BLOCK表中添加了另一个属性:

CUR_SHAPE_VERSION

BLOCK_ID和CUR_SHAPE_VERSION现在形成BLOCK_ID,SHAPE_VERSION上BLOCK_SHP表的外键。每个块可以具有0或1个当前形状。

在Hibernate中,我通过以下方式设置了第二个关联:

@OneToOne( cascade = CascadeType.ALL, optional = true )
@NotFound( action = NotFoundAction.IGNORE )
@JoinColumns( {
  @JoinColumn( name = "BLOCK_ID", referencedColumnName = "BLOCK_ID", insertable = false, updatable = false ),
  @JoinColumn( name = "CUR_SHAPE_VERSION", referencedColumnName = "SHAPE_VERSION", insertable = false, updatable = false ) } )
public BlockShape getCurrentShape() {
    return currentShape;
}

@NotFound注释是必需的,因为Hibernate在处理可空的一对一关联时遇到了麻烦。如果它没有找到关联,它会忽略它而不是抛出错误。

这对我来说并不是很令人满意,因为这意味着Hibernate并不真正意识到实体之间的正确关系。例如,如果我查询 currentShape不为空,则Hibernate不知道如何正确执行此查询 - 它正在查询 block_id不为null或cur_shape_version不为null

所以我想我有几个问题。首先,有没有更好的方法来建模数据库中的第二个关联?第二,Hibernate是否有更好的方法为它设置注释以更好地理解关系并能够在形状表上正确查询?

感谢您的帮助。

1 个答案:

答案 0 :(得分: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不鼓励使用复合键,原因很简单(而你遇到的问题只是其中之一)。

相关问题