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

时间:2012-11-24 06:50:15

标签: 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)

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

9 个答案:

答案 0 :(得分:73)

我遇到了同样的问题,

@NotFound(action = NotFoundAction.IGNORE)

解决了我的问题。

答案 1 :(得分:27)

如果使用@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;

答案 2 :(得分:18)

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

试试这个:

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

答案 3 :(得分:4)

我最近遇到过类似的问题,但问题是记录总是存在于DB中。所以我做了一些调查,发现在某些时候缓存的实体被标记为删除并重新加载失败,然后从DB重新加载。它发生在我Hibernate 4.3.5决赛中 然后我升级到Hibernate 4.3.11决赛,似乎解决了这个问题。

答案 4 :(得分:4)

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

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

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

答案 5 :(得分:1)

请尝试以下

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

@OneToMany(mappedBy="yourMappingattributeName",cascade=CascadeType.MERGE)

答案 6 :(得分:0)

如果其父级不存在,请使用@NotFound(action = NotFoundAction.IGNORE)

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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