LazyInitializationException 使用带有 Spring HATEOAS 的补丁添加

Her*_*iaz 5 rest spring patch lazy-loading hateoas

我有一个实体 ElementType,它有一组 EquipmentCodes:

@Entity 
@Table(name = "ELEMENT_TYPES")
public class ElementType extends AbstractEntity<Long> {

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name= "ELEM_TYPE_ID")
private Set<EquipmentCode> equipmentCodes;

}
Run Code Online (Sandbox Code Playgroud)

我将这两个类公开为具有存储库的休息资源:

@RepositoryRestResource(path = "elementTypes", collectionResourceRel = "elementTypes")
@Transactional
public interface ElementTypeRepository extends CrudRepository<ElementType, Long> {}
Run Code Online (Sandbox Code Playgroud)

现在如果我尝试一些操作,比如

获取https://localhost:8080/api/elementTypes/40529090

或 PATCH 发送

{
   "equipmentCodes" : [
   "https://localhost:8080/api/equipmentCodes/40529100"
    ]
}
Run Code Online (Sandbox Code Playgroud)

然而,如果我尝试向现有设备添加新的设备代码,它似乎工作正常:

 [
    {
     "op": "add",
     "path": "/equipmentCodes",
     "value": [
       "https://localhost:8080/api/equipmentCodes/40529099"
    ]
    }
]
Run Code Online (Sandbox Code Playgroud)

我明白了

org.hibernate.LazyInitializationException:无法延迟初始化集合,无法初始化代理 - 无会话,位于 org.springframework.data.rest.webmvc.json.patch.JsonLateObjectEvaluator.evaluate(JsonLateObjectEvaluator.java:45)

关于问题是什么的任何提示吗?我使用“add”的方式有问题还是Spring配置有问题?

编辑:这可能是一个语法错误,像这样我没有得到例外:

 [
    {
     "op": "add",
     "path": "/equipmentCodes",
     "value": "https://localhost:8080/api/equipmentCodes/40529099"
    }
]
Run Code Online (Sandbox Code Playgroud)

然而奇怪的是,它不是将 id 为 40529099 的现有 EquipmentCode 添加到 ElementType,而是只是插入一个新的空 EquipmentCode(当然,我将补丁发送到https://localhost:8080/api/elementTypes/40529090 ),删除集合中的其他元素,然后将新元素指定为 ElementType

为了澄清,我想要的是将数据库中已有的一个 EquipmentCode 添加到 ElementType 中的集合中,而不删除该集合中的当前 EquipmentCodes。