从多对一关系嵌入属性

Posted

技术标签:

【中文标题】从多对一关系嵌入属性【英文标题】:Embedding attributes from a many-to-one relationship 【发布时间】:2016-02-17 16:13:51 【问题描述】:

鉴于Oracle Database HR sample schema 中的COUNTRIESREGIONS 表:

COUNTRIES(country_id, country_name, region_id)
REGIONS(region_id, region_name)

还有这个Country实体类:

import javax.persistence.*;

@Entity
@Table(name = "COUNTRIES")
public class Country 
    @Id
    @Column(name = "COUNTRY_ID")
    private String id;

    @Column(name = "COUNTRY_NAME")
    private String name;

我想在一个Country 实体类中映射两个表,也就是说,不创建单独的Region 实体类。

而不是这种多对一的关系:

@ManyToOne
@JoinColumn(name = "REGION_ID")
private Region region;

我想要一个简单的String regionName 属性映射到REGIONS.REGION_NAME,使用REGIONS.REGION_ID = COUNTRIES.REGION_ID 作为连接条件。

JPA 2.0 是否支持这种映射?我应该使用哪些注释?

【问题讨论】:

您的意思是您想要 Region 的 SecondaryTable?为什么不阅读辅助表的 JPA 文档?互联网搜索发现很多 我认为你不能将@SecondaryTable 与非 PK 连接一起使用,这就是你在这里所拥有的。 【参考方案1】:

我很确定您不能将 @SecondaryTable 与非 PK 连接一起使用,这就是您在此处所拥有的,即表不共享相同的 PK。

当时我能看到的最简单(可能也是唯一的)选项是在数据库上创建一个视图并将实体映射到该视图:

create view vw_countries as
select 
    c.country_id as id, c.country_name as name, r.region_name as region
from 
    countries c
inner join 
    regions r on r.region_id = c.region_id

实体:

@Entity
@Table(name = "vw_countries")
public class Country

    @Id
    private Long id;

    private String name;

    private String region;

【讨论】:

以上是关于从多对一关系嵌入属性的主要内容,如果未能解决你的问题,请参考以下文章

flask 定义数据关系(多对一)

MyBatis之多对一关系

Hibernate 多对一关联查询

Hibernate中一对多和多对一关系

休眠:多对一关系失败

django--ORM表的多对一关系