[英]How to join two entities through two secondary tables in hibernate jpa?
[英]JPA join two secondary tables
我有這五個表:
REF_CT REF_CT_L REF_ST REF_ST_L
====== ======== ====== ========
CT_ID CT_ID ST_ID ST_ID
ST_ID LANGUAGE_ID NAME LANGUAGE_ID
NAME NAME REF_CODE NAME
REF_CODE DESCRIPTION DESCRIPTION
REF_LANGUAGE
============
LANGUAGE_ID
LOCALE_CODE
NAME
通過使用JPA,我創建了以下三個實體類:
類common.contact.City
@Entity @Table(name = "REF_CT") @SecondaryTable(name = "REF_CT_L") public class City implements Reference { @Id @Column(name = "CT_ID") @TableGenerator(name = "TABLE_GEN", table = "SYS_SEQ", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_VALUE", pkColumnValue = "CITY_SEQ") @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN") private Integer id; @Column(name = "NAME") private String name; @Column(table = "REF_CT_L", name = "NAME") private String value; @Column(name = "REF_CODE") private String refCode; @ManyToOne(targetEntity = Language.class) @JoinColumn(table = "REF_CT_L", name = "LANGUAGE_ID") private Language language; @ManyToOne(targetEntity = State.class, optional = true) @JoinColumn(name = "ST_ID", referencedColumnName = "ST_ID") private State state;
類common.contact.State
@Entity @Table(name = "REF_ST") @SecondaryTable(name = "REF_ST_L") public class State implements Reference { @Id @Column(name = "ST_ID") @TableGenerator(name = "TABLE_GEN", table = "SYS_SEQ", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_VALUE", pkColumnValue = "STATE_SEQ") @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN") private Integer id; @Column(name = "NAME") private String name; @Column(table = "REF_ST_L", name = "NAME") private String value; @Column(name = "REF_CODE") private String refCode; @OneToMany(targetEntity = City.class, mappedBy = "state") private Set<City> cities; @ManyToOne(targetEntity = Language.class) @JoinColumn(table = "REF_ST_L", name = "LANGUAGE_ID", unique = true, referencedColumnName = "LANGUAGE_ID") private Language language;
類common.system.Language
@Entity @Table(name = "SYS_LANGUAGE") public class Language implements BaseEntity { @Id @Column(name = "LANGUAGE_ID") @TableGenerator(name = "TABLE_GEN", table = "SYS_SEQ", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_VALUE", pkColumnValue = "LANGUAGE_SEQ") @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN") private Integer id; @Column(name = "LOCALE_CODE") private String locale; @Column(name = "NAME") private String name;
但是當我嘗試運行此查詢時
select city from City city where city.id = 1
我收到此錯誤:
org.hibernate.HibernateException: More than one row with the given identifier was found: 10, for class: common.contact.State
僅供參考,添加了以下數據:
REF_CT
CT_ID ST_ID NAME REF_CODE
===== ===== ==== ========
1 10 CHERAS CHE
REF_CT_L
CT_ID LANGUAGE_ID NAME DESCRIPTION
===== =========== ==== ===========
1 1 BANDAR CHERAS CHERAS BARU
1 2 CHERAS TOWN NEW CHERAS
REF_ST
ST_ID NAME REF_CODE
===== ==== ========
10 SELANGOR SEL
REF_ST_L
ST_ID LANGUAGE_ID NAME DESCRIPTION
===== =========== ==== ===========
10 1 SELANGOR SELANGOR BARU
10 2 SERIANGOR NEW SERIANGOR
REF_LANGUAGE
LANGUAGE_ID LOCALE_CODE NAME
=========== =========== ====
1 ms_En Malay
2 en_US English
生成的SQL是:
SELECT state0_.st_id AS st1_50_0_,
state0_.NAME AS name50_0_, state0_.ref_code AS ref4_50_0_,
state0_1_.language_id AS language2_51_0_, state0_1_.NAME AS name51_0_
FROM ref_st state0_ LEFT OUTER JOIN ref_st_l state0_1_
ON state0_.st_id = state0_1_.st_id
WHERE state0_.st_id = 10;
謝謝你的幫助!
您的代碼產生了LEFT JOIN,因為您將City-> State關系設置為可選。 將其更改為不可為空,您將獲得一個內部聯接,該聯接應解析返回的多行。
common.contact.City->
@ManyToOne(targetEntity = State.class, optional = false)
@JoinColumn(name = "ST_ID", referencedColumnName = "ST_ID", nullable = false)
private State state;
“ REF_ST”與“ REF_ST_L”具有一對多關系。 這意味着“ REF_ST_L”不能映射為輔助表(這意味着一對一關系)。
對於“ REF_CT”->“ REF_CT_L”,相同的邏輯有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.