当我尝试通过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)
@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;
}
答案 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
时,它应该可以工作