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.

Reply via email to