簡體   English   中英

EntityNotFoundException左聯接JPA-休眠

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM