【问题标题】:Removing childs from @OneToMany-association: CascadeType.ALL + orphanRemoval = true not working从@OneToMany-association 中删除子项:CascadeType.ALL + orphanRemoval = true 不起作用
【发布时间】:2012-05-03 07:30:18
【问题描述】:

我很难从 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();
}

我在这里做错了什么?

谢谢
强尼

【问题讨论】:

    标签: java hibernate jpa-2.0


    【解决方案1】:

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

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

    【讨论】:

    • 感谢 JB Nizet,这成功了。这里的代码:for (Iterator&lt;ProjectEntity&gt; iterator = personEntity.getProjects().iterator(); iterator.hasNext();) { ProjectEntity projectEntity = iterator.next(); projectEntity.setPerson(null); iterator.remove(); }
    • 如果人不能为空怎么办?
    • @IgorG。如果 person 不能为 null,则删除关联没有意义。
    • 这个答案不正确。您正在寻找的真正答案(并允许您保持非空约束)可以在这里找到:stackoverflow.com/questions/3068817/…
    • @JamesD:您链接到的答案与我的完全相同。 你需要添加一个 mappedBy 属性来声明关联的拥有方contact.setAccount(null);.
    猜你喜欢
    • 2015-11-13
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 2015-11-03
    • 2011-08-31
    • 2015-02-12
    • 2017-06-25
    相关资源
    最近更新 更多