【发布时间】:2012-11-12 09:46:03
【问题描述】:
当我尝试通过 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;
}
【问题讨论】:
-
要获得答案,您需要提供更多信息,例如:您到底在做什么?完成堆栈跟踪...并仔细检查该实体是否确实存在于数据库中。
-
您是否定义了从发票表到用户表的外键?正如@Ralph 所说,您应该检查给定用户(ID 为 5)是否确实存在。
-
当我使用 LAZY fetch 时它正在工作,是的,数据库中有实体。我不明白为什么它在 EAGER fetch 中不起作用,其余代码与以前相同。现在我使用 LAZY fetch 作为临时更改来解决问题。
-
我从未使用 setid() 方法定义 id,这意味着它仅从数据库中获取 id,并且它们是数据库中存在的外键。这是休眠中的错误
-
我还注意到,如果我在数据库中创建两张发票,那么即使 EAGAR fetch 也能正常工作,所以问题似乎只存在于一个用户的一张发票记录中。
标签: spring hibernate jpa spring-data-jpa