* Verifies that a collection remains contiguous and element
* indexes are reordered if an element is removed for a
* OneToMany relationship
*/
public void testOneToManyElementRemoval() {
OpenJPAEntityManagerSPI em = emf.createEntityManager();
// Verify field name is the default via fm
validateOrderColumnName(BattingOrder.class, "batters",
"batters_ORDER");// "batters_ORDER");
// Create some data
Player[] players = new Player[10];
ArrayList<Player> playersArr = new ArrayList<Player>();
em.getTransaction().begin();
for (int i = 0; i < 10 ; i++) {
players[i] = new Player("Player" + i, i+100);
em.persist(players[i]);
playersArr.add(players[i]);
}
em.getTransaction().commitAndResume();
// Persist the related entities
BattingOrder order = new BattingOrder();
order.setBatters(playersArr);
em.persist(order);
em.getTransaction().commit();
em.refresh(order);
em.clear();
// Verify order is correct.
BattingOrder newOrder = em.find(BattingOrder.class, order.id);
assertNotNull(newOrder);
for (int i = 0; i < 10 ; i++) {
assertEquals(newOrder.getBatters().get(i), (players[i]));
}
// Remove some items
em.getTransaction().begin();
newOrder.getBatters().remove(1);
playersArr.remove(1);
newOrder.getBatters().remove(5);
playersArr.remove(5);
em.getTransaction().commit();
em.clear();
// Simple assertion via find
newOrder = em.find(BattingOrder.class, order.id);
assertNotNull(newOrder);
assertNotNull(newOrder.getBatters());
assertEquals(playersArr.size(), newOrder.getBatters().size());
for (int i = 0; i < playersArr.size() ; i++) {
assertEquals(newOrder.getBatters().get(i), (playersArr.get(i)));
}
// Stronger assertion via INDEX value
validateIndexAndValues(em, "BattingOrder", "batters", 0,
playersArr.toArray(), "id",
order.id);
em.close();
}