使用Spring HATEOAS添加补丁的LazyInitializationException

时间:2017-03-07 17:10:38

标签: spring rest lazy-loading patch 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;

}

我将两个类都显示为具有存储库的Rest Resources:

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

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

  

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

或PATCH发送

{
   "equipmentCodes" : [
   "https://localhost:8080/api/equipmentCodes/40529100"
    ]
}

但是,如果我尝试将新的deviceCode添加到现有的设备中,它似乎工作正常:

 [
    {
     "op": "add",
     "path": "/equipmentCodes",
     "value": [
       "https://localhost:8080/api/equipmentCodes/40529099"
    ]
    }
]

我得到了

  

org.hibernate.LazyInitializationException:懒得初始化   一个集合,无法初始化代理 - 没有会话,at at   org.springframework.data.rest.webmvc.json.patch.JsonLateObjectEvaluator.evaluate(JsonLateObjectEvaluator.java:45)

有关问题的任何提示?我使用“添加”的方式是否有问题,或者它是关于Spring配置的?

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

 [
    {
     "op": "add",
     "path": "/equipmentCodes",
     "value": "https://localhost:8080/api/equipmentCodes/40529099"
    }
]

然而奇怪的是,不是将ID为40529099的现有EquipmentCode添加到ElementType,而是插入一个新的空EquipmentCode(当然我将补丁发送到https://localhost:8080/api/elementTypes/40529090),而不是另一个集合中的那些,然后将新元素与元素类型

相对应

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

0 个答案:

没有答案