【问题标题】:Multiple join associations in hibernate休眠中的多个连接关联
【发布时间】:2011-09-30 15:54:32
【问题描述】:

我的问题与数据库设计以及如何在 Hibernate 中对该设计进行建模有关。我有两个具有以下主键的表:

BLOCK (BLOCK_ID)
BLOCK_SHP (BLOCK_ID, SHAPE_VERSION)

BLOCK 到 BLOCK_SHP 是一对多的关系,因为单个块可以有许多不同的版本相关联的形状。到目前为止一切顺利。

第二个关联是我还希望能够获得块的 当前 形状。为此,我在 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中是否有更好的方法来设置注解,以便更好地理解关系并能够正确查询形状表?

感谢您的帮助。

【问题讨论】:

    标签: database hibernate database-design hibernate-annotations


    【解决方案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 不鼓励使用复合键,这是有充分理由的(您遇到的问题只是其中之一)。

    【讨论】:

    • 感谢 JB,此解决方案修复了所有问题并大大简化了表格关联。
    猜你喜欢
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 2012-07-08
    • 2016-08-15
    • 2016-04-20
    相关资源
    最近更新 更多