58

当我尝试通过 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)

实体类如下(不包括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;
}
4

10 回答 10

113

我有同样的问题,并且

@NotFound(action = NotFoundAction.IGNORE)

解决了我的问题。

于 2015-08-03T12:38:16.833 回答
46

如果您使用@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;
于 2014-02-25T04:28:15.383 回答
36

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

试试这个:

     //bi-directional many-to-one association to User
     @ManyToOne(fetch=FetchType.LAZY)
     @JoinColumn(name="Users_id")
     private User user = new User();
于 2012-11-26T04:45:36.010 回答
9

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

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

所以当另一个类 Y 有一个带有 ManyToOne 的 X 对象时,由于实体中的 null 值,它无法加载实体。

于 2017-03-02T00:45:11.957 回答
6

请尝试以下

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

@OneToMany(mappedBy="yourMappingattributeName",cascade=CascadeType.MERGE)
于 2018-08-04T09:46:52.257 回答
4

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

于 2016-04-07T06:42:25.683 回答
2

使用 @NotFound(action = NotFoundAction.IGNORE) 以防它的父级不存在

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

于 2019-01-25T21:33:25.547 回答
0

也许有人来到这个答案并发现它很有用:就我而言,我已将我的实体标记为已删除,与该实体有关系的实体找不到它。因此,将 deleted 更改为 false 对我有用。

于 2019-08-01T07:39:46.640 回答
0

当您添加注释referencedColumnName = COLUMN时它应该可以@JoinColumns工作@ManyToOne

于 2020-07-15T13:54:48.347 回答
0

您必须为所有实体实现 hashCode 和 equals 方法。例子:

@Override
public int hashCode() {
    return Objects.hash(getId());
}
于 2021-09-30T05:36:35.673 回答