我在以下实体中有一个双向的@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代码)获取包时,我在该行得到以下错误。
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)为null。我需要在那里获取EAGER。这个问题的解决方法是什么?没有项目时如何检索包裹?
使用@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注释引发异常。