我正在使用Spring-Boot编写程序,该程序具有Person
和Item
个实体,这些实体持久存储在内存中的HSQL数据库中。 Person
与Item
具有OneToMany关系,Item
与Person
具有ManyToOne关系。对于我的程序的前端我计划使用AngularJS,所以我需要后端返回实体是JSON格式(我还没有真正写出前端;我' m只是使用Postman立即发出RESTful命令来测试后端)。我最初在JsonManagedReference
和JsonBackReference
上使用Person
和Item
来阻止在JSON序列化期间发生的无限递归,并且正确链接Person
在Json中,Item
导致Item
在以Json身份返回时没有任何回复“人物”。
相反,我决定将Person
和Item
映射到服务层中的不同DTO,然后将其作为Json返回。在我尝试将Item
与Person
相关联之前,这一切似乎都有效。我按ID获取Person
和Item
,然后将Item
添加到Person
和saveAndFlush。 saveAndFlush命令返回一个更新的Person
,其中包含与Json链接的Item
,但只要我发出另一个请求,就好像它从未发生过一样。该链接似乎没有持久性。没有抛出异常,当我使用debug时,我确认作为saveAndFlush的参数传递的对象确实包含已更新的Person
和链接的Item
。我无法弄清楚出了什么问题,我将不胜感激。
请在GitHub here上查看我的代码(确保您正在查看" no-orm-library"分支,不" master" )。
更新:
所以,我最终做的是向ItemController和ItemService添加一个新方法来更新现有项目。现在,当调用ItemService中的updateExistingItem方法时,仍然像以前一样传入ItemDto。除了现在,ItemService不是通过映射器将ItemDto转换为项目,而是从ItemDto中提取项目ID,从ItemRepository获取具有该ID的Item,然后更新"选中"和"描述"在通过存储库将更新的项目保存回数据库之前,该项目的字段包含ItemDto中的值。这修复了我之前遇到的错误。现在,我遇到了另一个问题。如果我在将一个Item链接到Person后删除它,它也会删除它所链接的Person。我尝试将Person中的ownedItems List字段中的CascadeType和ALL中的ownedBy字段中的CascadeType更改为MERGE和PERSIST,但之后它只是忽略了所有删除(即我会删除一个Item但它会保留在数据库中,就好像我一样我没有把删除称为删除。我从来没有得到任何错误或例外,它只是不会持续任何删除)。由于那不起作用,我将CascadeType改回ALL以待进一步研究。有谁知道我做错了什么?