线程“主”中的异常javax.persistence.EntityNotFoundException:
找不到ID为00001388000307的CNPJ
我正在阅读jpa文档,我读到它尝试访问时抛出此异常(通过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
时,效果很好,所有推销员都使用他的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)
跳过此类错误,但是建议修复数据库以处理异常。