org.hibernate.AssertionFailure:hibernate@OneToMany关系中的空标识符
我在以下实体中拥有双向@OneToMany/@manytone关系:org.hibernate.AssertionFailure:hibernate@OneToMany关系中的空标识符,hibernate,jpa,spring-data-jpa,Hibernate,Jpa,Spring Data Jpa,我在以下实体中拥有双向@OneToMany/@manytone关系: @Entity public class Item implements java.io.Serializable { // other columns including ID @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long itemId; @ManyToOne(fetch = FetchType.EAGER)
@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);
}
我认为Hibernate尝试了一个左外部连接,并发现itemId(Item实体的Id)为空。我确实需要有人到那里去接我。这个问题的解决方法是什么?没有项目时如何检索包?使用@NotFound注释:
@OneToMany(fetch = FetchType.EAGER, mappedBy="package", cascade = CascadeType.ALL)
@NotFound(action=NotFoundAction.IGNORE)
private Set<Item> items = new HashSet<Item>(0);
@OneToMany(fetch=FetchType.EAGER,mappedBy=“package”,cascade=CascadeType.ALL)
@NotFound(action=NotFoundAction.IGNORE)
私有集项=新哈希集(0);
itemId
。您还可以检查数据库表是否设置为生成主键值,即DB中id字段的“自动递增”。@Jayasagar是的,这按预期工作,没有问题。谢谢,尚未尝试此操作。但是对于遗留的和维护糟糕的模式,我没有得到-。我认为我的用例非常常见。与没有项目的初始包有一对多关系。我有什么明显的遗漏吗?我认为你的情况很普遍,不能确切地说出失败的原因。我开始思考:是不是一旦项目在查询中左连接,hibernate就会尝试加载关联的包(但为什么呢?),它显然有空标识符,而这实际上就是失败的原因?在包到项目的左连接中,itemId
显示为空,因为没有与该包关联的项。但不确定如何解决这个问题。找到根本原因并解决它将是最好的解决方案,而不是本回答中提出的替代方案@heikkim@Jayasagar没错。如果Stack Overflow有这样的“建议解决方案”,那就太好了——除了硬回答和简短的评论之外,还有这种东西。
@OneToMany(fetch = FetchType.EAGER, mappedBy="package", cascade = CascadeType.ALL)
@NotFound(action=NotFoundAction.IGNORE)
private Set<Item> items = new HashSet<Item>(0);