Im not too strong on this, but I'll give it a try.
I dont think bn.setA(null) will change anything. From my understanding, what you are trying to say is "bn is now going to have a reference to A. Please set it to null". It still doesnt change the fact that b1 is still in relationship with a1. However, if you did this: bn.setA(b1.getA()), now a1.getB().equals(bn) returns true.
Expected result: (b1.contains(b11)) && (b1.contains(b12)) && ... && (b1.contains(b1n)) && (b1.contains(b2m)) && ----> This is where the magic happens. If you look at the expected results during the first change, (b1n.getA() == null), therefore the above change is equivalent to say: b2m.setA(null); But as you can see, b1.contains(b2m) is still true, result of the first change, therefore nothing had happened. (b2.contains(b21)) && (b2.contains(b22)) && ... && (b2.contains(b2m_1)) && (a1.isIdentical(b11.getA())) && (a1.isIdentical(b12.getA())) && ... && (a1.isIdentical(b1n.getA())) && (a2.isIdentical(b21.getA())) && (a2.isIdentical(b22.getA())) && ... && (a2.isIdentical(b2m_1.getA())) && (a1.isIdentical(b2m.getA()))
The only cases when the Container throws an IllegalStateException, in 10.3.8. is when the client tries to modified a CMR-valued field using the Collection API or java.util.Iterator in a transaction context other than the one that originally generated the cmr-valued field.