4

非常に単純な削除操作を実行しようとしていますが、DAO を JpaRepository に更新したため、どうにか機能しません。基本的にはこれです:

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

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

フィールドは期待どおりに更新され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
}

セッターとゲッターはすべて可能な限り単純です。

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

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

いくつかの詳細情報:

  • 春 3.2.2
  • 休止状態 4.2.2
  • 春データコモンズ 1.5.1
  • spring-data-jpa 1.3.2
4

1 に答える 1

12

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);
    }
}

それが役立つことを願っています。

于 2013-06-18T19:38:14.267 に答える