从多对一关系嵌入属性
Posted
技术标签:
【中文标题】从多对一关系嵌入属性【英文标题】:Embedding attributes from a many-to-one relationship 【发布时间】:2016-02-17 16:13:51 【问题描述】:鉴于Oracle Database HR sample schema 中的COUNTRIES
和REGIONS
表:
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;
【讨论】:
以上是关于从多对一关系嵌入属性的主要内容,如果未能解决你的问题,请参考以下文章