休眠中的多个连接关联
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,此解决方案修复了所有问题并大大简化了表格关联。以上是关于休眠中的多个连接关联的主要内容,如果未能解决你的问题,请参考以下文章
具有多个条件但 @WhereJoinTable 不起作用的休眠连接表