我在以下实体中有双向@OneToMany / @ManyToOne关系:
@Entity
public class Item implements java.io.Serializable {
// other columns including ID
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long itemId;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "packageId")
private Package package;
}
@Entity
public class Package {
// other columns including ID
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(fetch = FetchType.EAGER, mappedBy="package", cascade = CascadeType.ALL)
private Set<Item> items = new HashSet<Item>(0);
}
假设最初有一个没有项目的包,并且要向该包添加项目,当我尝试通过其Id packageRepository.findOne(packageId)
(Spring Data JPA代码)获取包时,我在该行得到以下错误。 / p>
org.hibernate.AssertionFailure: null identifier
at org.hibernate.engine.spi.EntityKey.<init>(EntityKey.java:69)
at org.hibernate.internal.AbstractSessionImpl.generateEntityKey(AbstractSessionImpl.java:247)
at org.hibernate.loader.Loader.extractKeysFromResultSet(Loader.java:794)
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:707)
我认为Hibernate尝试左外连接并发现itemId(Item
实体的Id)为空。我需要在那里获取EAGER。这个问题的解决方法是什么?如果没有项目,如何检索包?
答案 0 :(得分:0)
使用 @NotFound 注释:
@OneToMany(fetch = FetchType.EAGER, mappedBy="package", cascade = CascadeType.ALL)
@NotFound(action=NotFoundAction.IGNORE)
private Set<Item> items = new HashSet<Item>(0);
这可能不是解决您问题的最佳方法。 Hibernate文档将@NotFound描述为:
当Hibernate因为预期而无法解析关联时 关联元素不在数据库中(关联上的ID不正确 列),引发异常。这对遗产来说可能不方便 并且维护模式很糟糕。你可以要求Hibernate忽略这一点 元素而不是使用@NotFound引发异常 注释