猿问

在 JPA 中仅保存集合的一部分

我在 JPA 中有一个非常标准的 @OneToMany 映射,没有级联(默认设置),如下所示:


@JoinColumn(name = "PARENT_ID")

@OneToMany(fetch = FetchType.LAZY)

@OrderBy("date")

private List<ItemRow> items;

我的问题是,当我尝试 em.merge() 这个实体时,Hibernate 认为如果集合中不存在一个项目,它应该从数据库中删除。鉴于我没有显式调用 em.remove(),生成的 SQL 并没有真正尝试删除项目SET PARENT_ID = NULL,幸运的是,Hibernate 只是尝试执行由于数据库约束而失败的操作。


我不想加载所有项目只是为了将它们的父项保存到数据库中。那将是愚蠢的。我的用户界面是分页的,当客户端发送部分集合时,这并不意味着其他项目应该被删除,我只想插入和更新用户看到的行,并留下未列出的行。


我该怎么办?我应该从父实体中删除集合映射吗?是否有“无级联,真的,仅用于加载”的设置?


我正在使用 JBoss EAP 6.4,其中包含 Hibernate 4.2.18。


大话西游666
浏览 112回答 1
1回答

守着一只汪

阅读评论后,我决定使用普通 JDBC 保存父实体,以便我可以准确控制发生的情况。生成的代码有点乏味,但一旦仔细编写,它就足够健壮了。插入或更新父实体后,我可以遍历所有子实体并使用 JPA 一一保存它们。那部分工作正常。我希望这可以更加自动化,但是拥有与将要保存的内容不完全对应的内存中集合似乎是一种不受支持的操作。
随时随地看视频慕课网APP

相关分类

Java
我要回答