2017-10-13 50 views
0

異常線程 「main」 javax.persistence.EntityNotFoundException: 無法找到CNPJ ID爲00001388000307EntityNotFoundException LEFT JOIN JPA - Hibernate的

我閱讀JPA文檔,我讀了這則拋出異常當它試圖accesse(由EntityManger接口的方法getReference)和實體不存在

Thrown by the persistence provider when an entity reference obtained by EntityManager.getReference is accessed but the entity does not exist.

我有這樣的實體來說:Salesman e CNPJ。可能存在許多具有相同CNPJ的銷售人員,換句話說,關係@ManyToOne

這種關係是行得通的,好。

但是,當我嘗試執行查詢

select r from Salesman r join fetch r.yearMonth left join fetch r.cnpj 

帶來其yearMonth推銷員(它的工作!)關係及其CNPJ關係,拋出異常,當我嘗試做一個LEFT JOIN ,我提到。

的時候,不執行LEFT JOIN,偉大工程,與他CNPJs所有銷售人員和異常的沒什麼,BUUUUT,一些推銷員沒有CNPJ NAD我已經給他們帶來太大,有必要做一個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從推銷員CNPJ和bcnpj是從CNPJ。一些銷售人員帶着CNPJ NULL,我認爲這是問題所在。我不這麼認爲。

The return of the select

回答

0

嘗試啓用休眠SQL日誌與<property name="show_sql">true</property>看到查詢如何真正的(本地,就調用DB)的模樣,也許有休眠加工後的內連接。

要更改它,您可以嘗試@Column(nullable=true)註釋爲您的關係或@Fetch(FetchMode.SELECT)以查看實際查詢將如何更改。


原因是你有一個ID爲00001388000307的cnpj的引用,但是這樣的一行cnpj不存在。

您可以嘗試使用@NotFound(action=NotFoundAction.IGNORE)來跳過此類錯誤,但建議您修復您的句柄數據庫異常。

+0

我把日誌 –

+0

我已經試圖把@Column(nullable = true)和@Fetch(FetchMode.SELECT),繼續同樣的錯誤。 –

+0

查詢是否可以在數據庫上直接調用? – staszko032

0

您正在使用表Salesman中的cnpj列作爲外鍵和值列。在這種情況下@ staszko032的建議使用@NotFound(action=NotFoundAction.IGNORE)看起來像將工作,因爲你期望

但我認爲你應該重構你的模型,如果可能的話。您可以始終創建一個CNPJ實體,在這種情況下,如果沒有與CNPJ的關聯,並且可以使用INNER JOIN,或者使用2列,那麼當銷售人員沒有具體的相關CNPJ時將使用該列值作爲字符串)和另一個當它有(外鍵)

+0

這個實體CNPJ不是由我創建的。我收到了項目,我必須使用:( –

+0

我添加了註釋'@NotFound(action = NotFoundAction.IGNORE)',但是發生了「n + 1」查詢。 –

+0

我已經在執行聯合提取。 –