[英]EntityNotFoundException LEFT JOIN JPA - Hibernate
線程“主”中的異常javax.persistence.EntityNotFoundException:無法找到ID為00001388000307的CNPJ
我正在閱讀jpa文檔,我讀到它嘗試訪問時拋出此異常(通過EntityManger接口的getReference方法)並且該實體不存在
當訪問由EntityManager.getReference獲得的實體引用但該實體不存在時,持久化提供者將其拋出。
我有以下實體: Salesman
e CNPJ
。 可能存在許多具有相同CNPJ的推銷員,換句話說,是@ManyToOne
關系。
這種關系正常,可以。
但是,當我嘗試執行查詢時
select r from Salesman r join fetch r.yearMonth left join fetch r.cnpj
為了使推銷員具有yearMonth(正在運行!)關系及其CNPJ關系,當我嘗試進行“左加入”時,拋出了異常。
當我不執行LEFT JOIN
,效果很好,所有推銷員都使用他的CNPJ,但沒有例外,BUUUUT,有些推銷員也沒有CNPJ,而且我也必須帶他們,所以有必要進行LEFT JOIN
。
@Entity
public class Salesman{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@JoinColumn(name = "year_month")
@ManyToOne
private YearMonth yearMonth;
private String cnpjS;
@JoinColumn(name = "cnpj")
@ManyToOne
private CNPJ cnpj;
public AnoMes getYearMonth() {
return yearMonth;
}
public CNPJ getCnpj() {
return cnpj;
}
}
@Entity
public class CNPJ {
@Id
@Column(name = "CCG", length = 14)
private String ccg;
public String getCcg() {
return ccg;
}
}
Hibernate生成的選擇:
select *
from salesman s
inner join yearmonth y on s.ano_mes = y.id
left outer join cnpj c on s.cnpjS = c.CCG
該參考返回該值,rcnpj是Salesman的cnpj,bcnpj是CNPJ的。 一些推銷員附帶CNPJ NULL,我認為這是問題所在。 我不這么認為。
嘗試使用<property name="show_sql">true</property>
啟用hibernate sql日志記錄,以查看實際查詢(本機,在db上調用)的樣子,也許在hibernate處理之后存在內部聯接。
要更改它,您可以嘗試為您的關系添加@Column(nullable=true)
注釋,或通過@Fetch(FetchMode.SELECT)
來查看實際查詢將如何變化。
原因是您引用了ID為00001388000307的cnpj,但是cnpj的這一行不存在。
您可以嘗試使用@NotFound(action=NotFoundAction.IGNORE)
跳過此類錯誤,但建議修復數據庫以處理異常。
您將表Salesman上的cnpj列用作外鍵和值列。 在這種情況下,使用@NotFound(action=NotFoundAction.IGNORE)
@ staszko032的建議@NotFound(action=NotFoundAction.IGNORE)
預期工作
但是我認為您應該盡可能重構模型。 您可以始終創建一個CNPJ實體,在這種情況下,您不會沒有對CNPJ的了解就可以擁有Salesman,而可以使用INNER JOIN或使用2列,當Salesman沒有具體相關的CNPJ時將使用一列(字符串形式的值),而另一個則具有(外鍵)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.