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

问题描述 投票:2回答:1

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

hibernate jpa spring-data-jpa
1个回答
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注释引发异常。

© www.soinside.com 2019 - 2024. All rights reserved.