线程“主”中的异常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,我认为这是问题所在。我不这么认为。

java - EntityNotFoundException左联接JPA- hibernate-LMLPHP

最佳答案

尝试使用<property name="show_sql">true</property>启用hibernate sql日志记录,以查看实际查询(本地查询,在db上调用)的样子,也许在hibernate处理之后存在内部联接。

要更改它,您可以尝试为您的关系添加@Column(nullable=true)注释,或者尝试@Fetch(FetchMode.SELECT)查看实际查询的变化方式。



原因是您引用了ID为00001388000307的cnpj,但是cnpj的这一行不存在。

您可以尝试使用@NotFound(action=NotFoundAction.IGNORE)跳过此类错误,但是建议修复数据库以处理异常。

09-13 06:47