休眠中的多个连接关联

Posted

技术标签:

【中文标题】休眠中的多个连接关联【英文标题】: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中是否有更好的方法来设置注解,以便更好地理解关系并能够正确查询形状表?

感谢您的帮助。

【问题讨论】:

【参考方案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,此解决方案修复了所有问题并大大简化了表格关联。

以上是关于休眠中的多个连接关联的主要内容,如果未能解决你的问题,请参考以下文章

休眠:批处理大小?二级缓存?

如何使用具有多个连接的 SQL 查询并使用休眠计数

具有多个条件但 @WhereJoinTable 不起作用的休眠连接表

如何使用 Spring 管理具有不同 jdbc(或休眠?)的多个“运行时注意到”数据库连接?

带有连接的休眠自定义 SQL 查询 - 避免返回数组列表

连接两个表并在一行中合并多个关联