我在JPA中有一个非常标准的@OneToMany映射,没有级联(默认设置),如下所示:
@JoinColumn(name = "PARENT_ID")
@OneToMany(fetch = FetchType.LAZY)
@OrderBy("date")
private List<ItemRow> items;
我的问题是,当我尝试em.merge()这个实体时,Hibernate认为,如果集合中不存在某个项目,则应该将其从数据库中删除。鉴于我没有显式调用em.remove(),因此生成的SQL并没有真正尝试删除项目,因此Hibernate只是尝试执行SET PARENT_ID = NULL
,但由于数据库的限制而失败了。
我不想加载所有项目只是为了将其父项保存到数据库中。那太傻了。我的用户界面是分页的,当客户端发送部分集合时,这并不意味着应该删除其他项,我只想插入和更新用户看到的行,而将未列出的行留空。
我该怎么办?我应该从父实体中删除集合映射吗? 是否存在“不进行级联,实际上仅用于加载”的设置?
我正在使用包含Hibernate 4.2.18的JBoss EAP 6.4。
答案 0 :(得分:0)
阅读注释后,我决定使用纯JDBC保存父实体,以便我可以精确控制发生的情况。生成的代码有点单调乏味,但是只要仔细编写,它就足够健壮。
在插入或更新父实体之后,我可以遍历所有子实体,并使用JPA逐一保存它们。那部分工作正常。
我希望这样做可以更加自动化,但是具有与要保存的内容不完全对应的内存中集合似乎是一种不受支持的操作。