在 JPA 中仅保存集合的一部分
Saving only part of a collection in JPA
我在 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
由于数据库限制而失败,谢天谢地。
我不想为了将父项目保存到数据库而加载所有项目。那将是愚蠢的。我的用户界面是分页的,当客户端发送部分集合时,这并不意味着应该删除其他项目,我只想插入和更新用户看到的行,而不要管未列出的行。
我该怎么办?我应该从父实体中删除集合映射吗? 有没有设置“不级联,真的,只用这个加载”吗?
我正在使用 JBoss EAP 6.4,其中包含 Hibernate 4.2.18。
阅读评论后,我决定使用普通 JDBC 保存父实体,这样我就可以准确控制发生的事情。生成的代码有点乏味,但一旦仔细编写,它就足够健壮了。
插入或更新父实体后,我可以遍历所有子实体并使用 JPA 将它们一一保存。那部分工作正常。
我希望这可以更加自动化,但是内存中的集合与要保存的内容不完全对应似乎是一种不受支持的操作。
我在 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
由于数据库限制而失败,谢天谢地。
我不想为了将父项目保存到数据库而加载所有项目。那将是愚蠢的。我的用户界面是分页的,当客户端发送部分集合时,这并不意味着应该删除其他项目,我只想插入和更新用户看到的行,而不要管未列出的行。
我该怎么办?我应该从父实体中删除集合映射吗? 有没有设置“不级联,真的,只用这个加载”吗?
我正在使用 JBoss EAP 6.4,其中包含 Hibernate 4.2.18。
阅读评论后,我决定使用普通 JDBC 保存父实体,这样我就可以准确控制发生的事情。生成的代码有点乏味,但一旦仔细编写,它就足够健壮了。
插入或更新父实体后,我可以遍历所有子实体并使用 JPA 将它们一一保存。那部分工作正常。
我希望这可以更加自动化,但是内存中的集合与要保存的内容不完全对应似乎是一种不受支持的操作。