我正在使用Hibernate 3.5 JPA,并对此实现的特定行为表示怀疑 .

我们有父母,有两个孩子以下属性

@OneToMany(cascade = CascadeType.ALL, mappedBy = "parent", fetch = FetchType.LAZY)
private List<ChildOne> childOneList;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "parent", fetch = FetchType.LAZY)
private List<ChildTwo> childTwoList;

和ChildOne以下属性引用Parent(假设甚至是ChildTwo,代码如下)

@JoinColumn(name = "PUID", referencedColumnName = "PUID")
@ManyToOne
private Parent parent;

我使用JPA EntityManager.merge(PARENT)持久化父对象,此时我没有这个特定父级的子级,但是这个子表有许多与此父级记录无关的记录 . (链接子记录将在一段时间后创建)

parent.setChildOneList(null);
parent.setChildTwoList(null);
em.merge(parent);

会发生什么,在EntityManager.merge上,它首先在子节点上使用“左外连接”触发选择查询(它获取所有不相关的记录),然后在父记录上应用插入/更新 . 日志中的SQL查询就像 .

Hibernate: select  parent0_.PUID as PUID96_1_,childoneli1_.PUID as PUID96_3_,childoneli1_.CHILD_UID as CHILD1_3_,childoneli1_.CHILD_UID as CHILD1_97_0_,childoneli1_.PUID as PUID97_0_ from PARENTT parent0_ left outer join CHILDONE childoneli1_ on parent0_.PUID=childoneli1_.PUID where parent0_.PUID=?|#]
Hibernate: insert into PARENTT (PUID) values (?)|#]

通过删除Cascade.ALL可以暂时解决这个问题 . 现在,我将来可能需要这个,所以想通过Hibernate JPA实现知道关于这种行为的任何指针 . (注释导入包含所有javax ....没有特定的Hibernate) .

如果这是Hibernate JPA的预期,那么请指出如何使用Cascade.ALL更正它,并且在合并调用时没有不必要的“左外连接”选择 .