Spring Hibernate多对一映射中的EntityNotFoundException,但存在数据

Spring Hibernate多对一映射中的EntityNotFoundException,但存在数据,spring,hibernate,jpa,spring-data-jpa,Spring,Hibernate,Jpa,Spring Data Jpa,当我试图通过Invoice对象获取用户时,得到javax.persistence.EntityNotFoundException错误 invoice.getUser().getId() 错误如下 实体类如下(不包括getter和setter) @实体 @表(name=“users”) 公共类用户实现可序列化{ 私有静态最终长serialVersionUID=1L; @身份证 @GeneratedValue(策略=GenerationType.AUTO) @列(unique=true,nullab

当我试图通过Invoice对象获取用户时,得到javax.persistence.EntityNotFoundException错误

invoice.getUser().getId()

错误如下 实体类如下(不包括getter和setter)
@实体
@表(name=“users”)
公共类用户实现可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(unique=true,nullable=false)
私有int-id;
.
.
.
//与发票的双向多对一关联
@OneToMany(mappedBy=“用户”)
私人清单发票;
}
@实体
@表(name=“发票”)
公共类Invoice实现可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(unique=true,nullable=false)
私有int-id;
.
.
.
//对用户的双向多对一关联
@manytone(fetch=FetchType.LAZY)
@JoinColumn(name=“Users\u id”)
私人用户;
}

问题可能是直接实体不存在,但也可能是来自该实体的引用实体(通常为急切获取类型)或可选=false

试试这个:

     //bi-directional many-to-one association to User
     @ManyToOne(fetch=FetchType.LAZY)
     @JoinColumn(name="Users_id")
     private User user = new User();

如果使用@ManyToOne,则引用的实体必须存在。唯一的其他选项是将该字段指定为long,并通过单独的查询检索引用的实体

如果找不到请求的实体,则引发异常(javax.persistence.EntityNotFoundException),而不是返回null

如果延迟加载且未手动处理此异常,请使用@NotFound注释解决此异常

 @ManyToOne(
        fetch = FetchType.LAZY)
    @NotFound(
        action = NotFoundAction.IGNORE)
    @JoinColumn(
        name = COLUMN,
        referencedColumnName = COLUMN,
        insertable = false,
        updatable = false)
    private Table table;

我也有同样的问题,而且

@NotFound(action = NotFoundAction.IGNORE)

解决了我的问题。

我最近遇到了类似的问题,但问题是数据库中始终存在记录。所以我做了一些调查,发现在从数据库重新加载之前,缓存的实体被标记为删除并重新加载失败。它发生在我的
hibernate4.3.5
Final中
然后我升级到Hibernate 4.3.11Final,它似乎可以解决问题。

不确定这是否适用于您的情况

但我有一个类似的问题,我直接在数据库表X中更新并设置了一个字段null,但在java类中,该字段是@NotNull


因此,当另一个类Y具有多个X对象时,它无法加载该实体,因为该实体中存在空值。

请尝试以下操作

@OneToMany(mappedBy=“yourMappingattributeName”,cascade=CascadeType.ALL)

@OneToMany(mappedBy="yourMappingattributeName",cascade=CascadeType.MERGE)
如果父项不存在,请使用@NotFound(action=NotFoundAction.IGNORE)



通过使用cascade=CascadeType.ALL,它将删除它的父实体

也许有人得出了这个答案并发现它很有用:在我的例子中,我已将我的实体标记为已删除,与该实体有关系的实体无法找到它。因此,将deleted改为false对我来说很有效。

@ManyToOne
注释的
@JoinColumns
中添加
referencedColumnName=COLUMN
时应该会起作用。

要得到答案,您需要提供更多信息,例如:您到底做什么?、完成堆栈跟踪。。。并仔细检查数据库中是否确实存在该实体。是否有从发票表到用户表定义的外键?正如@Ralph所说的,您应该检查给定的用户(id为5)是否确实存在。当我使用LAZY fetch时,它正在工作,是的,数据库中存在实体。我不明白为什么它不能在急切获取中工作,其余的代码和以前一样。目前,我使用LAZY fetch作为临时更改来解决此问题。我从未使用setid()方法定义id,这意味着它仅从数据库中获取id,并且其是数据库中存在的外键。这是Hibernate中的一个bug吗?我还注意到,如果我在数据库中创建了两个发票,那么即使EAGAR fetch也能工作,所以问题似乎只存在于一个用户的一个发票记录中。之前我使用的是LAZY fetch,但它在工作,并且在我不理解的急切fetch中不工作。这是一个bug还是什么我不知道的应该报告。@kakawat我有与上面相同的问题,但代码不在我们的控制范围内,我删除了数据库中的一些行,不正确的数据是否会导致这种错误?懒惰的抓取最终会导致错误,就像当你试图引导本应该被急切抓取的东西时,你最终会遇到懒惰的异常。我希望我能理解为什么一开始就失败了。我在Spring Boot 1.5.1中运行Hibernate 5.0.11,我面临同样的问题和FetchType。Lazy不能解决我的问题。在我的例子中,关系不是双向的,我只声明了@ManyToOne。我使用的是java-ee-api-7.0.jar,而不是Hibernate。只有当我给NotFoundannotation时,异常才会发生。知道我做错了什么吗?很简单。容易的。更快。伟大的解决方案@迪赖:我没有试过。不管关联实体是否存在,NotFound都是实用的。唯一的问题是它会以静默方式失败。是否有人找到更好的解决方案,在记录丢失的链接的同时优雅地处理此错误?使用时,请注意这会导致性能问题!修复不一致的数据就可以了。谢谢,这是我的问题。查找
@NotNull
@JoinColumn([…]nullable=false)
@Negal,您的评论实际上是该线程中对该问题的唯一真实解释。其他排名靠前的答案只是权宜之计。我也有同样的问题,因为我有很多人,懒洋洋的。当我添加
@NotFound(action=NotFoundAction.IGNORE)
时,它解决了问题。
@NotFound(action = NotFoundAction.IGNORE)
@OneToMany(mappedBy="yourMappingattributeName",cascade=CascadeType.MERGE)