私はこのようなものを持っています
@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);
それでも同じエラーが発生しますこれを機能させる方法はありますか?