Return-Path: Delivered-To: apmail-openjpa-users-archive@locus.apache.org Received: (qmail 32408 invoked from network); 8 Oct 2008 17:38:22 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 8 Oct 2008 17:38:22 -0000 Received: (qmail 3357 invoked by uid 500); 8 Oct 2008 17:38:21 -0000 Delivered-To: apmail-openjpa-users-archive@openjpa.apache.org Received: (qmail 3338 invoked by uid 500); 8 Oct 2008 17:38:21 -0000 Mailing-List: contact users-help@openjpa.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: users@openjpa.apache.org Delivered-To: mailing list users@openjpa.apache.org Received: (qmail 3326 invoked by uid 99); 8 Oct 2008 17:38:21 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 08 Oct 2008 10:38:21 -0700 X-ASF-Spam-Status: No, hits=-1.3 required=10.0 tests=DNS_FROM_SECURITYSAGE,RCVD_IN_DNSWL_MED,RCVD_NUMERIC_HELO,SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (athena.apache.org: local policy) Received: from [216.82.245.115] (HELO mail121.messagelabs.com) (216.82.245.115) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 08 Oct 2008 17:37:16 +0000 X-VirusChecked: Checked X-Env-Sender: kc6522@att.com X-Msg-Ref: server-9.tower-121.messagelabs.com!1223487347!24722199!1 X-StarScan-Version: 5.5.12.14.2; banners=-,-,- X-Originating-IP: [144.160.112.25] Received: (qmail 6568 invoked from network); 8 Oct 2008 17:35:48 -0000 Received: from sbcsmtp3.sbc.com (HELO tlph064.enaf.dadc.sbc.com) (144.160.112.25) by server-9.tower-121.messagelabs.com with AES256-SHA encrypted SMTP; 8 Oct 2008 17:35:48 -0000 Received: from enaf.dadc.sbc.com (localhost.localdomain [127.0.0.1]) by tlph064.enaf.dadc.sbc.com (8.14.2/8.14.2) with ESMTP id m98HZllf017274 for ; Wed, 8 Oct 2008 12:35:47 -0500 Received: from td03xsmtp006.US.Cingular.Net (td03xsmtp006.us.cingular.net [170.35.131.170]) by tlph064.enaf.dadc.sbc.com (8.14.2/8.14.2) with ESMTP id m98HZhxO017227 for ; Wed, 8 Oct 2008 12:35:44 -0500 Received: from BD01XSMTP002.US.Cingular.Net ([135.214.27.51]) by td03xsmtp006.US.Cingular.Net with Microsoft SMTPSVC(6.0.3790.1830); Wed, 8 Oct 2008 12:35:43 -0500 Received: from BD01MSXMB015.US.Cingular.Net ([135.214.26.11]) by BD01XSMTP002.US.Cingular.Net with Microsoft SMTPSVC(6.0.3790.1830); Wed, 8 Oct 2008 10:35:32 -0700 Received: from 141.204.56.204 ([141.204.56.204]) by BD01MSXMB015.US.Cingular.Net ([135.214.26.11]) with Microsoft Exchange Server HTTP-DAV ; Wed, 8 Oct 2008 17:34:33 +0000 User-Agent: Microsoft-Entourage/12.11.0.080522 Date: Wed, 08 Oct 2008 10:32:31 -0700 Subject: Re: How to annotate a positional List From: Kevin Cox To: Message-ID: Thread-Topic: How to annotate a positional List Thread-Index: Ackpa9d4G2ifd/miqkK589oO/zvXXw== In-Reply-To: Mime-version: 1.0 Content-type: text/plain; charset="US-ASCII" Content-transfer-encoding: 7bit X-OriginalArrivalTime: 08 Oct 2008 17:35:32.0521 (UTC) FILETIME=[43AA4990:01C9296C] X-TM-AS-Product-Ver: SMEX-7.0.0.1584-5.5.1027-16206.000 X-TM-AS-Result: No--11.172900-0.000000-31 X-Virus-Checked: Checked by ClamAV on apache.org Andy, thanks for you input. I am trying your last solution. The actual classes are shown below. The DB is oracle 10g. I am running the test using the following code to create a book then looking up the book and trying to add a couple pages. The SQL generate is exactly as you suspected and shown below. I get an Optimistic locking error when trying to commit the updates (added pages). Do you see what might be wrong? //First, just create a book and a couple pages - works fine EntityManager em = MyPersistence.getInstance().createEntityManager(); em.getTransaction().begin(); PageOfBook p1 = new PageOfBook(); p1.setData("This is a page 1 in a book"); PageOfBook p2 = new PageOfBook(); p2.setData("This is a page 2 in a book"); Book b = new Book("My Book Example for Lists"); b.getPages().add(p1); b.getPages().add(p2); em.persist(b); em.getTransaction().commit(); //WORKS GREAT UP TO HERE - RECORDS GET WRITTEN TO DB AND OrderColumn is creating a numbered sequence! //Now, I am testing if I can add to the list, look up the saved book em.getTransaction().begin(); //Query q3 = em.createQuery("SELECT book from Book book where book.id = ?1"); //q3.setParameter(1,1L); //Book book = (Book) q3.getSingleResult(); BOTH THE QUERY AND THE EM.FIND RESULT IN Optimistic locking error exception Book book = em.find(Book.class, 1L); PageOfBook p3 = new PageOfBook(); p3.setData("This is a page 3 in a book"); PageOfBook p4 = new PageOfBook(); p3.setData("This is a page 4 in a book"); book.getPages().add(p3); book.getPages().add(p4); em.getTransaction().commit(); //on this commit, I get Exception in thread "main" org.apache.openjpa.persistence.RollbackException: Optimistic locking errors were detected when flushing to the data store. The following objects may have been concurrently modified in another transaction: [com.play.cmsdata.PageOfBook@5f55b990, com.play.cmsdata.PageOfBook@4319b06e] at org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.ja va:523) at hellojpa.Main.createBook(Main.java:122) at hellojpa.Main.main(Main.java:37) Caused by: org.apache.openjpa.persistence.OptimisticLockException: Optimistic locking errors were detected when flushing to the data store. The following objects may have been concurrently modified in another transaction: [com.play.cmsdata.PageOfBook@5f55b990, com.play.cmsdata.PageOfBook@4319b06e] at org.apache.openjpa.kernel.BrokerImpl.newFlushException(BrokerImpl.java:2160) at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2010) at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:1908) at org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:1826) at org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalManagedRuntime.jav a:81) at org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java:1350) at org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBroker.java:877) at org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.ja va:512) ... 2 more Caused by: org.apache.openjpa.persistence.OptimisticLockException: An optimistic lock violation was detected when flushing object instance "com.play.cmsdata.PageOfBook@5f55b990" to the data store. This indicates that the object was concurrently modified in another transaction. FailedObject: com.play.cmsdata.PageOfBook@5f55b990 em.close(); ----------------------------------------------------------- import org.apache.openjpa.persistence.jdbc.OrderColumn; import org.apache.openjpa.persistence.PersistentCollection; import javax.persistence.*; import java.util.List; import java.util.ArrayList; @Entity @SequenceGenerator(name="BookSeq", sequenceName="BOOK_SEQ") public class Book { @Id @GeneratedValue(strategy= GenerationType.TABLE, generator="BookSeq") private long id; String title; @PersistentCollection(elementCascade=CascadeType.ALL) @OrderColumn private List pages = new ArrayList(); public Book() { } public Book(long id) { this.id = id; } public Book(String title) { this.title = title; } public long getId() { return id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public List getPages() { return pages; } public void setPages(List pages) { this.pages = pages; } } ----------------------------------------------------------- import javax.persistence.*; import javax.persistence.Lob; import javax.persistence.GeneratedValue; @Entity @SequenceGenerator(name="PageOfBookSeq", sequenceName="PAGEOFBOOK_SEQ") public class PageOfBook { @Id @GeneratedValue(strategy= GenerationType.TABLE, generator="PageOfBookSeq") private long id; @Lob private String data; public PageOfBook() { } public long getId() { return id; } public String getData() { return data; } public void setData(String data) { this.data = data; } } Here are the actual generated tables (from sql trace): CREATE TABLE Book (id NUMBER NOT NULL, title VARCHAR2(255), PRIMARY KEY (id)) CREATE TABLE Book_PageOfBook (BOOK_ID NUMBER, PAGES_ID NUMBER, ordr NUMBER) CREATE TABLE PageOfBook (id NUMBER NOT NULL, data CLOB, PRIMARY KEY (id))