当前位置: 首页 > 面试题库 >

从@OneToMany关联中删除子项:CascadeType.ALL + orphanRemoval = true无法正常工作

宇文兴言
2023-03-14
问题内容

我很难从OneToMany协会中删除孩子。我的实体:

@Entity
@Table(name = "PERSON")
public class PersonEntity extends BaseVersionEntity<Long> implements Comparable<PersonEntity>
{
  ...
  // bi-directional many-to-one association to Project
  @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "person", orphanRemoval = true)
  private final Set<ProjectEntity> projects = new HashSet<ProjectEntity>();
  ...

@Entity
@Table(name = "PROJECT")
public class ProjectEntity extends BaseVersionEntity<ProjectPK>
{
  @EmbeddedId
  private ProjectPK id;
  ...
  // bi-directional many-to-one association to UdbPerson
  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "PERSON_ID", nullable = false, insertable = false, updatable = false)
  private PersonEntity person;
  ...

@Embeddable
public class ProjectPK implements Serializable
{
  // default serial version id, required for serializable classes.
  private static final long serialVersionUID = 1L;

  @NotNull
  @Column(name = "PERSON_ID")
  private Long personId;
  ...

我删除孩子的尝试失败:

personEntity.getProjects().clear();

这可行,但是我认为那不是正确的方法:

for (Iterator<ProjectEntity> iterator = personEntity.getProjects().iterator(); iterator.hasNext();)
{
  ProjectEntity projectEntity = iterator.next();
  projectDao.deleteEntity(projectEntity);
  iterator.remove();
}

我在这里做错了什么?

由于
强尼


问题答案:

关联是双向的,并且双向关联的拥有方是没有mappedBy属性的一方。这意味着在这种情况下,拥有方是项目方。

Hibernate仅考虑拥有方知道关联是否存在。这意味着要破坏人员与项目之间的关联,必须将人员设置null为项目中的。



 类似资料:
  • 问题内容: 这是我的带有SQL查询的PHP代码,但是输出与预期不符: 而且我得到这样的SQL查询: VALUES之后的第一个在哪里? 问题答案: 并具有相同的运算符优先级,但保持关联。第一次串联后的意思是: 该字符串已添加到您的密钥中,例如 因此,该字符串在该数字上下文中转换为整数并 消失 。要解决此问题,请在您的加法前后加上括号。

  • 当试图从Eclipse Oxygen中删除一个项目时,什么也没有发生,日志中会写入一个异常。我只需在包浏览器中右键单击一个项目,然后选择“删除”选项。我用的是Eclipse Oxygen.1a (4.7.1a)。以下是完整的构建信息: 下面是一个堆栈跟踪示例: 任何想法如何解决这个问题?或任何解决方法?

  • 我已经创建了纸张和Mcq问题之间的映射如下。 } 当我更新纸质实体时,它会删除所有MCQ。 SQL输出:

  • 我有两个具有一个任意关系的表 类ServiceProvider{ ... @OneTomany(Fetch=FetchType.Eager,MappedBy=“ServiceProvider”,Cascade={CascadeType.All,CascadeType.Remove},OlphanRemove=true)@OnDelete(action=OnDeleteAction.Cascade)

  • 我在搜索孙子的时候遇到了一些奇怪的弹性搜索行为。我的孙子不能识别每个父文档。当我要求弹性搜索返回父节点的子节点时,它会返回所有可能的命中。然后当我要求归还我那些有大孩子的孩子时,我得到了不正确的结果。有些时候,我没有得到点击或更少。但是当我检查我的孙子的路由和父ID时,我发现他们确实存在于他们的父节点中。但是我不明白为什么我得到的结果不正确。你们中有人遇到过这样的问题吗???我检查了我的代码三次,