【发布时间】:2020-05-19 07:42:21
【问题描述】:
我想了解我在 sap hana 上遇到的一种行为。
我有A类
package org.cl;
@Entity
@Table(name = "CLASS_A")
@Getter
@Setter
@EqualsAndHashCode
public class ClassA implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "CLASS_A_ID")
private String id;
@OneToMany(mappedBy = "classA", cascade = CascadeType.ALL)
private List<ClassB> classesB = new ArrayList<>();
}
和B类
package org.cl;
@Entity
@Table(name = "CLASS_B")
@Setter
@Getter
public class ClassB {
@Id
@GeneratedValue
@Column(name = "CLASS_B_ID")
private Long id;
@Column(name = "CLASS_A_ID", nullable=false, updatable = false, insertable = false)
private String classAId;
@ManyToOne
@JoinColumn(name = "CLASS_A_ID", referencedColumnName = "CLASS_A_ID")
private ClassA classA;
}
如果我应用这段代码
List<ClassB> classBInstances = populateList(classAInstance);
classAInstance.setSlaves(classBInstances);
entityManager.merge(user);
- 如果 classBInstances 仅填充了新实例,则一切正常
- 如果 classBInstances 填充了新旧元素的混合,并且一些元素已被删除,则在 db 中我会找到所有原始元素以及新元素
- 如果所有原始元素都已被删除并替换为完全不同的新实例,我再次在数据库中找到原始元素和新元素
为了让事情正常工作,我必须从列表和数据库中显式删除不需要的元素,然后为每个新的 classB 实例应用持久化。
我该如何解决这种情况?
我想只使用列表进行操作,如果一个元素没有出现在列表中必须删除,如果出现必须我坚持。
我的系统
- querydsl-jpa: 4.2.1
- querydsl 核心:4.2.1
- 休眠核心:5.3.7
- sap hana db 版本:1.00.122.06.1485334242
- java 运行时:8
提前感谢您的支持
【问题讨论】:
-
我认为这只是根据 JPA 规范为集合级联合并更新定义的行为。可能您想为您的
OneToMany关联设置orphanRemoval = true。另请阅读:vladmihalcea.com/merge-entity-collections-jpa-hibernate -
非常感谢,这是正确答案!
-
@Jan-WillemGmeligMeyling:您能否将该评论作为答案,以便其他用户也可以接受它。
标签: java hibernate jpa querydsl hana