Hi Jeremy, It looks like you are correct on the LOB data being null. That manifesting itself as an optimistic lock exception is odd. And, thanks for catching my error.
I ran the rest of my (non-thorough) tests to prove out the usage of @PersistentCollection(elementCascade=CascadeType.ALL,fetch=FetchType.EAGER) @OrderColumn Below, I show the content of the Book_PageOfBook table after each modification to the list. The results are correct! And, when inserting, the implementation renumbers the list exactly as expected. I also show the SQL statements associated to each step. There might be a bug here, however. Notice that the last update statement that modifies the list is repeated. It's a non-damaging bug, but incorrect nonetheless. Could be a trace logging error - I'm not sure. Anyone have ideas on why the last update statement repeats? The following steps happen in sequence. Initial creation of book and 5 pages -------------------------------------------------------------- as shown previously with Jeremy's bug fix help on the p3 to p4 variable name screw up BOOK_ID PAGES_ID ORDR 1 1 0 1 2 1 1 4 2 1 3 3 1 5 4 book.getPages().remove(2L) which is the 3rd item -------------------------------------------------------------- em.getTransaction().begin(); Book book = em.find(Book.class, 1L); book.getPages().remove(2); //which is item 3 in the array em.getTransaction().commit(); BOOK_ID PAGES_ID ORDR 1 1 0 1 2 1 1 3 3 1 5 4 book.getPages().remove(2L) again with adding a page 6 -------------------------------------------------------------- em.getTransaction().begin(); Book book = em.find(Book.class, 1L); book.getPages().remove(2); //which is item 3 in the array PageOfBook p6 = new PageOfBook(); p6.setData("This is a page 6 in a book"); book.getPages().add(p6); em.getTransaction().commit(); 1 1 0 1 2 1 1 5 4 1 6 5 book.getPages().add(2,p7) inserting page 7 at position 2, 3rd position -------------------------------------------------------------- em.getTransaction().begin(); Book book = em.find(Book.class, 1L); PageOfBook p7 = new PageOfBook(); p7.setData("This is a page 7 in a book"); book.getPages().add(2,p7); em.getTransaction().commit(); BOOK_ID PAGES_ID ORDR 1 1 0 1 2 1 1 7 2 1 5 3 1 6 4 book.getPages().remove(2L) -------------------------------------------------------------- SELECT t0.ordr, t1.id, t1.data FROM Book_PageOfBook t0, PageOfBook t1 WHERE t0.BOOK_ID = ? AND t0.PAGES_ID = t1.id ORDER BY t0.ordr ASC [params=(long) 1] DELETE FROM Book_PageOfBook WHERE BOOK_ID = ? AND PAGES_ID = ? [params=(long) 1, (long) 4] UPDATE Book SET title = ? WHERE id = ? [params=(String) My Book Example for Lists, (long) 1] UPDATE PageOfBook SET data = ? WHERE id = ? [params=(Reader) [EMAIL PROTECTED], (long) 4] UPDATE PageOfBook SET data = ? WHERE id = ? [params=(Reader) [EMAIL PROTECTED], (long) 2] UPDATE PageOfBook SET data = ? WHERE id = ? [params=(Reader) [EMAIL PROTECTED], (long) 1] UPDATE PageOfBook SET data = ? WHERE id = ? [params=(Reader) [EMAIL PROTECTED], (long) 5] UPDATE PageOfBook SET data = ? WHERE id = ? [params=(Reader) [EMAIL PROTECTED], (long) 3] UPDATE PageOfBook SET data = ? WHERE id = ? [params=(Reader) [EMAIL PROTECTED], (long) 3] >>> LOOK: the last two updates for id=3 is repeated at the end. book.getPages().remove(2L) again with adding a page 6 -------------------------------------------------------------- DELETE FROM Book_PageOfBook WHERE BOOK_ID = ? AND PAGES_ID = ? [params=(long) 1, (long) 3] INSERT INTO PageOfBook (id, data) VALUES (?, ?) [params=(long) 6, (Reader) [EMAIL PROTECTED] UPDATE PageOfBook SET data = ? WHERE id = ? [params=(Reader) [EMAIL PROTECTED], (long) 3] UPDATE PageOfBook SET data = ? WHERE id = ? [params=(Reader) [EMAIL PROTECTED], (long) 2] UPDATE PageOfBook SET data = ? WHERE id = ? [params=(Reader) [EMAIL PROTECTED], (long) 2] UPDATE Book SET title = ? WHERE id = ? [params=(String) My Book Example for Lists, (long) 1] UPDATE PageOfBook SET data = ? WHERE id = ? [params=(Reader) [EMAIL PROTECTED], (long) 5] UPDATE PageOfBook SET data = ? WHERE id = ? [params=(Reader) [EMAIL PROTECTED], (long) 1] UPDATE PageOfBook SET data = ? WHERE id = ? [params=(Reader) [EMAIL PROTECTED], (long) 1] INSERT INTO Book_PageOfBook (BOOK_ID, PAGES_ID, ordr) VALUES (?, ?, ?) [params=(long) 1, (long) 6, (int) 5] >>> LOOK: the last two updates for id=1 is repeated at the end. book.getPages().add(2,p7) inserting page 7 at position 2 -------------------------------------------------------------- DELETE FROM Book_PageOfBook WHERE BOOK_ID = ? [params=(long) 1] INSERT INTO PageOfBook (id, data) VALUES (?, ?) [params=(long) 7, (Reader) [EMAIL PROTECTED] UPDATE PageOfBook SET data = ? WHERE id = ? [params=(Reader) [EMAIL PROTECTED], (long) 1] UPDATE PageOfBook SET data = ? WHERE id = ? [params=(Reader) [EMAIL PROTECTED], (long) 5] UPDATE PageOfBook SET data = ? WHERE id = ? [params=(Reader) [EMAIL PROTECTED], (long) 6] UPDATE PageOfBook SET data = ? WHERE id = ? [params=(Reader) [EMAIL PROTECTED], (long) 2] UPDATE PageOfBook SET data = ? WHERE id = ? [params=(Reader) [EMAIL PROTECTED], (long) 2] UPDATE Book SET title = ? WHERE id = ? [params=(String) My Book Example for Lists, (long) 1] INSERT INTO Book_PageOfBook (BOOK_ID, PAGES_ID, ordr) VALUES (?, ?, ?) [params=(long) 1, (long) 1, (int) 0] INSERT INTO Book_PageOfBook (BOOK_ID, PAGES_ID, ordr) VALUES (?, ?, ?) [params=(long) 1, (long) 2, (int) 1] INSERT INTO Book_PageOfBook (BOOK_ID, PAGES_ID, ordr) VALUES (?, ?, ?) [params=(long) 1, (long) 7, (int) 2] INSERT INTO Book_PageOfBook (BOOK_ID, PAGES_ID, ordr) VALUES (?, ?, ?) [params=(long) 1, (long) 5, (int) 3] INSERT INTO Book_PageOfBook (BOOK_ID, PAGES_ID, ordr) VALUES (?, ?, ?) [params=(long) 1, (long) 6, (int) 4] INSERT INTO Book_PageOfBook (BOOK_ID, PAGES_ID, ordr) VALUES (?, ?, ?) [params=(long) 1, (long) 6, (int) 4] >>> LOOK: the last two updates for page_id 6 and ordr=4 is repeated at the end.