org.hibernate.AssertionFailure:hibernate@OneToMany关系中的空标识符

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)

我在以下实体中拥有双向@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)
    @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);
这可能不是解决你问题的最好办法。Hibernate文档将@NotFound的使用描述为:

当Hibernate无法解析关联时,因为 关联元素不在数据库中(关联上的id错误 列),将引发异常。这可能会给遗留问题带来不便 以及维护不好的模式。您可以要求Hibernate忽略这样的问题 元素,而不是使用@NotFound引发异常 注释


你能在类中发布ID字段吗?我猜要么你的ID映射错误,要么你在数据库中有一个空ID。若要知道SQL查询是什么,请启用SQL日志记录并亲自查看。@JBNizet添加了Id字段。检索包时,表中没有项。因此,包到项的左外部联接(从SQL日志记录)会导致null
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);