gpt4 book ai didi

spring - JpaRepository 删除子元素

转载 作者:行者123 更新时间:2023-12-01 08:32:23 27 4
gpt4 key购买 nike

我正在尝试做一个非常简单的删除操作,但不知何故它不起作用,因为我将 DAO 更新为 JpaRepository。基本上是这样的:

A a = aRepository.findOne(id);
a.setSomeField("someNewString");

List<B> bList = a.getBs();
bList.clear();
aRepository.saveAndFlush(a);

字段 get 已按预期更新,但 bList 保持不变。我什至试过:
A a = aRepository.findOne(id);
a.setSomeField("someNewString");

List<B> bList = a.getBs();
for(B b : bList) {
bRepository.delete(b);
}
bRepository.flush();
bList.clear();
aRepository.saveAndFlush(a);

还是一样...

A类看起来像这样:
@Entity
@Table(name = "A")
public class A implements Serializable {
private static final long serialVersionUID = -1286451120913657028L;

@Column(name = "id", length = 16, nullable = false, updatable = false)
@GenericGenerator(name = "uuid", strategy = "uuid2")
@GeneratedValue(generator = "uuid")
@Basic(fetch = FetchType.EAGER)
@Id
protected UUID id;

@OneToMany(mappedBy = "a", fetch = FetchType.EAGER)
@Cascade({ CascadeType.ALL })
List<B> bList;

// getter + setter
}

我究竟做错了什么?!

B类:
@Entity
@Table(name = "B")
public class B implements Serializable {
@Column(name = "id", length = 16, nullable = false, updatable = false)
@GenericGenerator(name = "uuid", strategy = "uuid2")
@GeneratedValue(generator = "uuid")
@Basic(fetch = FetchType.EAGER)
@Id
protected UUID id;

@ManyToOne(optional = false)
@JoinColumns({ @JoinColumn(name = "A_id", referencedColumnName = "id", nullable = false) })
@Valid
A a;

// setter + getter
}

Setter 和 getter 都和 possbile 一样简单:
public List<B> getBList() {
return bList;
}

public void setBList(List<B> bList) {
this.bList = bList;
}

更多信息:
  • Spring 3.2.2
  • hibernate 4.2.2
  • spring-data-commons 1.5.1
  • spring-data-jpa 1.3.2
  • 最佳答案

    更新 A.bList 属性如下:

    public class A {
    @OneToMany(mappedBy = "a", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
    List<B> bList;
    }
    orphanRemoval = true 注释属性将告诉底层 JPA 实现删除没有任何父级的 B 记录。

    此外,由于 B 端管理关联,因此您应该在断开关系时清除其 a 属性。为了使这更容易阅读并从调用者那里消除此类实现细节的负担,您应该在 A 中引入管理方法:
    public class A {
    public void clearBList() {
    for (B b : bList) {
    b.releaseA();
    }
    bList.clear();
    }
    }

    public class B {
    void releaseA() {
    this.a = null;
    }
    }

    您应该避免直接暴露集合,而是返回它的不可变版本,以防止客户端在 A 类不知道的情况下直接修改集合。 A 管理 B 列表,所以它应该完全控制它!
    public class A {
    public List<B> getBList() {
    return Collections.unmodifiableList(bList);
    }
    }

    希望有帮助。

    关于spring - JpaRepository 删除子元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17175976/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com