Hibernate中的EntityNotFoundException多数到一个映射但是存在数据

Bad*_*ngh 43 spring hibernate jpa spring-data-jpa

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

invoice.getUser().的getId()

错误如下

javax.persistence.EntityNotFoundException: Unable to find com.indianretailshop.domain.User with id 5
    at org.hibernate.ejb.Ejb3Configuration$Ejb3EntityNotFoundDelegate.handleEntityNotFound(Ejb3Configuration.java:137)
    at org.hibernate.proxy.AbstractLazyInitializer.checkTargetState(AbstractLazyInitializer.java:189)
    at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:178)
    at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:215)
Run Code Online (Sandbox Code Playgroud)

实体类如下(不包括getter和setter)

@Entity
@Table(name="users")
public class User implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(unique=true, nullable=false)
    private int id;

    .
        .
        .

    //bi-directional many-to-one association to Invoice
    @OneToMany(mappedBy="user")
    private List<Invoice> invoices;
}

@Entity
@Table(name="invoice")
public class Invoice implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(unique=true, nullable=false)
    private int id;
        .
        .
        .

    //bi-directional many-to-one association to User
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="Users_id")
    private User user;
}
Run Code Online (Sandbox Code Playgroud)

oze*_*ray 85

我有同样的问题,而且

@NotFound(action = NotFoundAction.IGNORE)
Run Code Online (Sandbox Code Playgroud)

解决了我的问题.

  • @dirai我没有尝试。无论您不介意关联实体是否存在,NotFound都是实用的。 (4认同)

sha*_*lee 30

如果使用@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;
Run Code Online (Sandbox Code Playgroud)


raj*_*wat 22

问题可能是直接实体不存在,但也可能是来自该实体的引用实体,通常用于EAGER提取类型,或者可选= false.

试试这个:

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

  • 延迟获取最终导致错误的产生,因为当您尝试引导本来希望获取的东西时,最终会导致LazyLoadException。我希望我能理解为什么它没有开始。我在Spring Boot 1.5.1中运行Hibernate 5.0.11 (2认同)
  • 我面临同样的问题,而 FetchType.Lazy 并没有解决我的问题。在我的情况下,这种关系不是双向的,我只声明了 @ManyToOne。我使用 java-ee-api-7.0.jar 作为 JPA 而不是 Hibernate。只有当我给 NotFoundannotation 时,才会发生异常。知道我可能做错了什么吗? (2认同)

小智 5

不知道这是否适用于您的情况。

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

因此,当另一个类Y的ManyToOne对象具有X对象时,由于该实体中的值为null,因此无法加载该实体。

  • 谢谢,这是我的问题。寻找 `@NotNull` 和 `@JoinColumn([...]nullable = false)`。 (5认同)

小智 5

请尝试以下操作

@OneToMany(mappedBy="yourMappingattributeName",cascade=CascadeType.ALL) 或者

@OneToMany(mappedBy="yourMappingattributeName",cascade=CascadeType.MERGE)
Run Code Online (Sandbox Code Playgroud)