JPA saveAndFlush返回正确更新的实体,但更新后的实体未保留在数据库

时间:2015-07-18 17:25:52

标签: java json jackson spring-boot spring-data-jpa

我正在使用Spring-Boot编写程序,该程序具有PersonItem个实体,这些实体持久存储在内存中的HSQL数据库中。 PersonItem具有OneToMany关系,ItemPerson具有ManyToOne关系。对于我的程序的前端我计划使用AngularJS,所以我需要后端返回实体是JSON格式(我还没有真正写出前端;我' m只是使用Postman立即发出RESTful命令来测试后端)。我最初在JsonManagedReferenceJsonBackReference上使用PersonItem来阻止在JSON序列化期间发生的无限递归,并且正确链接Person在Json中,Item导致Item在以Json身份返回时没有任何回复“人物”。

相反,我决定将PersonItem映射到服务层中的不同DTO,然后将其作为Json返回。在我尝试将ItemPerson相关联之前,这一切似乎都有效。我按ID获取PersonItem,然后将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以待进一步研究。有谁知道我做错了什么?

0 个答案:

没有答案