Spring JpaRepository删除子元素

Spring JpaRepository删除子元素,spring,hibernate,list,jpa,repository,Spring,Hibernate,List,Jpa,Repository,我正在尝试执行一个非常简单的删除操作,但不知何故,自从我将DAOs更新为JpaRepository之后,它就不起作用了。基本上是这样的: A a = aRepository.findOne(id); a.setSomeField("someNewString"); List<B> bList = a.getBs(); bList.clear(); aRepository.saveAndFlush(a); 还是一样 A类看起来像这样: @Entity @Table(name = "

我正在尝试执行一个非常简单的删除操作,但不知何故,自从我将DAOs更新为JpaRepository之后,它就不起作用了。基本上是这样的:

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

List<B> bList = a.getBs();
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
}
setter和getter都尽可能简单:

public List<B> getBList() {
    return bList;
}

public void setBList(List<B> bList) {
    this.bList = bList;
}
公共列表getBList(){
返回bList;
}
公共列表(列表bList){
this.bList=bList;
}

更多信息:

  • 春季3.2.2
  • 休眠4.2.2
  • spring数据共享1.5.1
  • spring数据jpa 1.3.2

更新
A.bList
属性,如下所示:

public class A {
    @OneToMany(mappedBy = "a", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
    List<B> bList;
}
您应该避免直接公开集合,而是返回集合的不可变版本,以防止客户端在A类不知道的情况下直接修改集合
A
管理
B
列表,因此它应该完全控制它

public class A {
    public List<B> getBList() {
        return Collections.unmodifiableList(bList);
    }
}
公共A类{
公共列表getBList(){
返回集合。不可修改列表(bList);
}
}

希望有帮助。

B班是什么样子的?还有A.getBs()方法?更新了最初的帖子。谢谢!我现在让它工作了:我把
CascadeType.ALL
放在
@OneToMany
注释中。之前,我不得不使用hibernate的
@Cascade
注释。现在我将保留这两个注释。而且我还添加了
删除=true
。用于清除列表
a.getBList().clear();a.保存和刷新(a)足够了。:)
public class A {
    @OneToMany(mappedBy = "a", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
    List<B> bList;
}
public class A {
    public void clearBList() {
        for (B b : bList) {
            b.releaseA();
        }
        bList.clear();
    }
}

public class B {
    void releaseA() {
        this.a = null;
    }
}
public class A {
    public List<B> getBList() {
        return Collections.unmodifiableList(bList);
    }
}