Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 仅在JPA中保存集合的一部分_Java_Hibernate_Jpa_Orm_Jboss - Fatal编程技术网

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

Java 仅在JPA中保存集合的一部分,java,hibernate,jpa,orm,jboss,Java,Hibernate,Jpa,Orm,Jboss,我在JPA中有一个非常标准的@OneToMany映射,没有级联(默认设置),如下所示: @JoinColumn(name = "PARENT_ID") @OneToMany(fetch = FetchType.LAZY) @OrderBy("date") private List<ItemRow> items; @JoinColumn(name=“PARENT\u ID”) @OneToMany(fetch=FetchType.LAZY) @订购人(“日期”) 私人清单项目; 我

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

@JoinColumn(name = "PARENT_ID")
@OneToMany(fetch = FetchType.LAZY)
@OrderBy("date")
private List<ItemRow> items;
@JoinColumn(name=“PARENT\u ID”)
@OneToMany(fetch=FetchType.LAZY)
@订购人(“日期”)
私人清单项目;
我的问题是,当我尝试em.merge()这个实体时,Hibernate认为如果集合中不存在某个项,则应该将其从数据库中删除。由于我没有显式地调用em.remove(),因此生成的SQL并没有真正尝试删除这些项,Hibernate只是尝试执行
设置PARENT_ID=NULL
,谢天谢地,这会由于数据库约束而失败

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

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


我使用的是JBoss EAP 6.4,其中包含Hibernate 4.2.18。

在阅读了这些评论之后,我决定用普通JDBC保存父实体,这样我就可以准确地控制发生了什么。结果代码有点乏味,但只要仔细编写,就足够健壮了

插入或更新父实体后,我可以循环遍历所有子实体,并使用JPA逐个保存它们。那部分很好用


我希望这可以更加自动化,但内存中的集合与要保存的内容不完全对应,这似乎是一种不受支持的操作。

一旦您说要保存父级,一旦您说要保存行。你到底想达到什么目的?我只想拯救父母。这些行也将被持久化,但这在另一个方法中发生。我只是不希望em.merge(parent)干扰该方法。em.merge()不是正确的工具。您应该只将实际需要保存的内容发送到服务器(例如,通常是表单字段的值)。您所需要做的就是加载实体并修改需要更新的属性(即从浏览器发送的内容)。我将尝试一下。我已经不再使用这种模式(加载实体、修改字段并在事务结束时保存它们),因为只有em.merge()检查
@Version
。此特定实体没有
@Version
,因此避免使用em.merge()可能会奏效。这真的很让人困惑,因为我必须根据非常微妙的行为在不同的策略之间移动。如果父事务中的更改一直干扰子事务中的更改,我想我也会尝试将行保存到另一个事务中。该定义使模式无效,假定ItemRow中的“ID”是该实体的主键。要么你漏掉了什么,要么架构坏了。