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

时间:2013-11-18 08:29:03

标签: hibernate jpa spring-data-jpa

我在以下实体中有双向@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。这个问题的解决方法是什么?如果没有项目,如何检索包?

1 个答案:

答案 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引发异常   注释