0

私はこのようなものを持っています

@Entity
public class A implements Serializable {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Basic(optional = false)
  private Long id;
  @Basic(optional = false)
  private String name;
  @ManyToMany
  private List<B> bList = new ArrayList<>(0);

  public A() {
  }

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

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

  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }


}

@Entity
public class B implements Serializable {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Basic(optional = false)
  private Long id;
  @Basic(optional = false)
  private Integer number;
  @ManyToMany
  private List<A> aList = new ArrayList<>(0);

  public B() {
  }

  public List<A> getaList() {
    return aList;
  }

  public void setaList(List<A> bList) {
    this.aList = bList;
  }

  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  public Integer getNumber() {
    return number;
  }

  public void setNumber(Integer number) {
    this.number = number;
  }
}

また

public class C {

  public C() {
  }

  public boolean addAtoB(Session hibernate, A a, B b) throws HibernateException {
    a.getbList().add(b);
    b.getaList().add(a);
    hibernate.saveOrUpdate(a);
    hibernate.saveOrUpdate(b);
    A aa = (A) hibernate.get(A.class, a.getId());
    B bb = (B) hibernate.get(B.class, b.getId());
    if (aa.getbList().contains(b) && bb.getaList().contains(b)) {
      return true;
    }
    return false;
  }

  public boolean removeAfromB(Session hibernate, A a, B b) throws HibernateException {
    a.getbList().remove(b);
    b.getaList().remove(a);
    hibernate.saveOrUpdate(a);
    hibernate.saveOrUpdate(b);
    A aa = (A) hibernate.get(A.class, a.getId());
    B bb = (B) hibernate.get(B.class, b.getId());
    if (!(aa.getbList().contains(b) && bb.getaList().contains(b))) {
      return true;
    }
    return false;
  }

  public boolean addListOfAtoB(Session hibernate, List<A> a, B b) throws HibernateException {
    boolean test = false;
    for (int i = 0; i < a.size(); i++) {
      A aa = a.get(i);
      addAtoB(hibernate, aa, b);
    }
    test = true;
    return test;
  }

  public boolean removeListOfAtoB(Session hibernate, List<A> a, B b) throws HibernateException {
    boolean test = false;
    for (int i = 0; i < a.size(); i++) {
      A aa = a.get(i);
      removeAfromB(hibernate, aa, b);
    }
    test = true;
    return test;
  }

  public Integer halfOfB(Session hibernate, List<B> b) throws Exception {

    for (int i = 0; i < b.size(); i++) {
      B bb = b.get(i);
      List<A> aa = bb.getaList();
      if (aa.size() <= 5) {
        return aa.size();
      } else {
        Integer br = (Integer) hibernate.createCriteria(B.class)
                .setProjection(Projections.max("number")).uniqueResult() + 1;
        B bbb = new B();
        bbb.setNumber(br);
        List<A> half = aa.subList(aa.size() / 2, aa.size());
        //error
        removeListOfAtoB(hibernate, half, bb);
        addListOfAtoB(hibernate, half, bbb);
        halfOfB(hibernate, b);
      }

    }
    throw new Exception("error in halfOfB");
  }
}

halfOfB は、名前のリストを新しいリストに半分にする再帰的な方法であり、リストが B の数の下に A から少なくとも 5 つ以上の名前を持つようになります。

1対多ではない理由を誰かが尋ねる前に、両方のエンティティが複数のアプリケーションを持つ必要があるため、ManytoManyが唯一のオプションです。

junit のすべてのメソッドは、halfOfB のテストが java.util.ConcurrentModificationException をスローすることを除いて、緑色です。これによると、インデックスを使用しない場合、ConcurrentModificationException をスローする必要はありません。また、順序を逆にした場合

 addListOfAtoB(hibernate, half, bbb);
 removeListOfAtoB(hibernate, half, bb);

それでも同じエラーが発生しますこれを機能させる方法はありますか?

4

1 に答える 1

0

違いはよくわかりませんが、これは問題なく動作します。

public Integer halfOfB(Session hibernate, List<B> b) throws Exception {

    for (int i = 0; i < b.size(); i++) {
      B bb = b.get(i);
      List<A> aa = bb.getaList();
      if (repeat(bb, hibernate, b)) {
        return aa.size();
      } else {
        repeat(bb, hibernate, b);
      }

    }
    throw new Exception("error in halfOfB");
  }

  private boolean repeat(B bb, Session hibernate, List<B> b) throws Exception {
    List<A> aa = bb.getaList();
    if (aa.size() <= 5) {
      return true;
    } else {
      Integer br = (Integer) hibernate.createCriteria(B.class)
              .setProjection(Projections.max("number")).uniqueResult() + 1;
      B bbb = new B();
      bbb.setNumber(br);
      List<A> half = aa.subList(aa.size() / 2, aa.size());
      removeListOfAtoB(hibernate, half, bb);
      addListOfAtoB(hibernate, half, bb);
    }
    return false;
  }
于 2012-09-30T04:27:23.227 に答える