You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by jr...@apache.org on 2009/07/30 21:34:33 UTC

svn commit: r799425 - in /openjpa/trunk: openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/ openjpa-persistence-jdbc/src/test/resources/org/apache/openjpa/persistence/util/ openjpa-persistence/src/main/java/org/apache/openjpa/p...

Author: jrbauer
Date: Thu Jul 30 19:34:33 2009
New Revision: 799425

URL: http://svn.apache.org/viewvc?rev=799425&view=rev
Log:
OPENJPA-1175 Updated util methods to handle load state checking of embeddables and collections.

Added:
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/EagerEmbedRel.java   (with props)
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/MapEntity.java   (with props)
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/MapKeyEmbed.java   (with props)
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/MapValEntity.java   (with props)
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/RelEntity.java   (with props)
    openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/org/apache/openjpa/persistence/util/
    openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/org/apache/openjpa/persistence/util/persistence.xml   (with props)
Modified:
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/EagerEmbed.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/EagerEntity.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/LazyEntity.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/TestPersistenceUnitUtil.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/TestPersistenceUtil.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/TestProviderUtil.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/OpenJPAPersistenceUtil.java
    openjpa/trunk/openjpa-project/src/doc/manual/jpa_overview_emfactory.xml
    openjpa/trunk/openjpa-project/src/doc/manual/jpa_overview_persistence.xml

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/EagerEmbed.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/EagerEmbed.java?rev=799425&r1=799424&r2=799425&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/EagerEmbed.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/EagerEmbed.java Thu Jul 30 19:34:33 2009
@@ -19,8 +19,12 @@
 package org.apache.openjpa.persistence.util;
 
 import java.sql.Date;
+import java.util.Set;
 
+import javax.persistence.ElementCollection;
 import javax.persistence.Embeddable;
+import javax.persistence.FetchType;
+import javax.persistence.OneToMany;
 import javax.persistence.Temporal;
 import javax.persistence.TemporalType;
 
@@ -32,7 +36,7 @@
     
     @Temporal(TemporalType.DATE)
     private Date endDate;
-
+        
     public void setStartDate(Date startDate) {
         this.startDate = startDate;
     }
@@ -48,4 +52,5 @@
     public Date getEndDate() {
         return endDate;
     }
+
 }

Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/EagerEmbedRel.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/EagerEmbedRel.java?rev=799425&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/EagerEmbedRel.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/EagerEmbedRel.java Thu Jul 30 19:34:33 2009
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.openjpa.persistence.util;
+
+import java.util.Set;
+
+import javax.persistence.CascadeType;
+import javax.persistence.ElementCollection;
+import javax.persistence.Embeddable;
+import javax.persistence.FetchType;
+import javax.persistence.OneToMany;
+
+@Embeddable
+public class EagerEmbedRel {
+    
+    @ElementCollection(fetch=FetchType.EAGER)
+    private Set<Integer> intVals;
+    
+    @OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL)
+    private Set<EagerEntity> eagerEnts;
+
+    public void setIntVals(Set<Integer> intVals) {
+        this.intVals = intVals;
+    }
+
+    public Set<Integer> getIntVals() {
+        return intVals;
+    }
+
+    
+    public void setEagerEnts(Set<EagerEntity> eagerEnts) {
+        this.eagerEnts = eagerEnts;
+    }
+
+    public Set<EagerEntity> getEagerEnts() {
+        return eagerEnts;
+    }
+}

Propchange: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/EagerEmbedRel.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/EagerEntity.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/EagerEntity.java?rev=799425&r1=799424&r2=799425&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/EagerEntity.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/EagerEntity.java Thu Jul 30 19:34:33 2009
@@ -18,9 +18,13 @@
  */
 package org.apache.openjpa.persistence.util;
 
+import java.util.List;
+
 import javax.persistence.Basic;
+import javax.persistence.ElementCollection;
 import javax.persistence.Embedded;
 import javax.persistence.Entity;
+import javax.persistence.FetchType;
 import javax.persistence.Id;
 import javax.persistence.Transient;
 
@@ -35,6 +39,12 @@
     
     @Embedded    
     private EagerEmbed eagerEmbed;
+
+    @Embedded    
+    private EagerEmbedRel eagerEmbedRel;
+
+    @ElementCollection(fetch=FetchType.EAGER)
+    private List<EagerEmbed> eagerEmbedColl;
     
     @Transient
     private String transField;
@@ -70,4 +80,20 @@
     public String getTransField() {
         return transField;
     }
+
+    public void setEagerEmbedColl(List<EagerEmbed> eagerEmbedColl) {
+        this.eagerEmbedColl = eagerEmbedColl;
+    }
+
+    public List<EagerEmbed> getEagerEmbedColl() {
+        return eagerEmbedColl;
+    }
+
+    public void setEagerEmbedRel(EagerEmbedRel eagerEmbedRel) {
+        this.eagerEmbedRel = eagerEmbedRel;
+    }
+
+    public EagerEmbedRel getEagerEmbedRel() {
+        return eagerEmbedRel;
+    }
 }

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/LazyEntity.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/LazyEntity.java?rev=799425&r1=799424&r2=799425&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/LazyEntity.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/LazyEntity.java Thu Jul 30 19:34:33 2009
@@ -18,11 +18,17 @@
  */
 package org.apache.openjpa.persistence.util;
 
+import java.util.List;
+
 import javax.persistence.Basic;
+import javax.persistence.CascadeType;
+import javax.persistence.ElementCollection;
 import javax.persistence.Embedded;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
 import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.OneToOne;
 import javax.persistence.Transient;
 
 @Entity
@@ -36,6 +42,15 @@
     
     @Embedded    
     private LazyEmbed lazyEmbed;
+
+    @ElementCollection(fetch=FetchType.LAZY)
+    private List<LazyEmbed> lazyEmbedColl;
+
+    @OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL)
+    private List<RelEntity> relEntities;
+    
+    @OneToOne(fetch=FetchType.LAZY)
+    private RelEntity relEntity;
     
     @Transient
     private String transField;
@@ -71,4 +86,28 @@
     public String getTransField() {
         return transField;
     }
+
+    public void setLazyEmbedColl(List<LazyEmbed> lazyEmbedColl) {
+        this.lazyEmbedColl = lazyEmbedColl;
+    }
+
+    public List<LazyEmbed> getLazyEmbedColl() {
+        return lazyEmbedColl;
+    }
+
+    public void setRelEntities(List<RelEntity> relEntities) {
+        this.relEntities = relEntities;
+    }
+
+    public List<RelEntity> getRelEntities() {
+        return relEntities;
+    }
+
+    public void setRelEntity(RelEntity relEntity) {
+        this.relEntity = relEntity;
+    }
+
+    public RelEntity getRelEntity() {
+        return relEntity;
+    }
 }

Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/MapEntity.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/MapEntity.java?rev=799425&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/MapEntity.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/MapEntity.java Thu Jul 30 19:34:33 2009
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.openjpa.persistence.util;
+
+import java.util.Map;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name="MAPENT")
+public class MapEntity {
+
+    @Id
+    @GeneratedValue
+    private int id;
+    
+    @OneToOne(fetch=FetchType.EAGER, cascade=CascadeType.ALL)
+    private MapValEntity mapValEntity;
+
+    @OneToMany(fetch=FetchType.EAGER)
+    private Map<MapKeyEmbed, MapValEntity> mapEntities;
+    
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public int getId() {
+        return id;
+    }
+
+    public void setMapValEntity(MapValEntity mapValEntity) {
+        this.mapValEntity = mapValEntity;
+    }
+
+    public MapValEntity getMapValEntity() {
+        return mapValEntity;
+    }
+
+    public void setMapEntities(Map<MapKeyEmbed, MapValEntity> mapEntities) {
+        this.mapEntities = mapEntities;
+    }
+
+    public Map<MapKeyEmbed, MapValEntity> getMapEntities() {
+        return mapEntities;
+    }
+}

Propchange: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/MapEntity.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/MapKeyEmbed.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/MapKeyEmbed.java?rev=799425&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/MapKeyEmbed.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/MapKeyEmbed.java Thu Jul 30 19:34:33 2009
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.openjpa.persistence.util;
+
+import javax.persistence.Embeddable;
+
+@Embeddable
+public class MapKeyEmbed {
+
+    private String firstName;
+    
+    private String lastName;
+
+    public void setFirstName(String firstName) {
+        this.firstName = firstName;
+    }
+
+    public String getFirstName() {
+        return firstName;
+    }
+
+    public void setLastName(String lastName) {
+        this.lastName = lastName;
+    }
+
+    public String getLastName() {
+        return lastName;
+    }
+    
+}

Propchange: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/MapKeyEmbed.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/MapValEntity.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/MapValEntity.java?rev=799425&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/MapValEntity.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/MapValEntity.java Thu Jul 30 19:34:33 2009
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.openjpa.persistence.util;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name="MVTABLE")
+public class MapValEntity {
+
+    @Id
+    @GeneratedValue
+    private int id;
+    
+    private int intVal;
+    
+    @OneToOne(fetch=FetchType.EAGER, mappedBy="mapValEntity", 
+        cascade=CascadeType.ALL)
+    private MapEntity mapEntity;
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public int getId() {
+        return id;
+    }
+
+    public void setIntVal(int intVal) {
+        this.intVal = intVal;
+    }
+
+    public int getIntVal() {
+        return intVal;
+    }
+
+    public void setMapEntity(MapEntity mapEntity) {
+        this.mapEntity = mapEntity;
+    }
+
+    public MapEntity getMapEntity() {
+        return mapEntity;
+    }    
+}

Propchange: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/MapValEntity.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/RelEntity.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/RelEntity.java?rev=799425&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/RelEntity.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/RelEntity.java Thu Jul 30 19:34:33 2009
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.openjpa.persistence.util;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+@Entity
+public class RelEntity {
+
+    @Id
+    @GeneratedValue
+    private int id;
+    
+    private String name;
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public int getId() {
+        return id;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+    
+}

Propchange: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/RelEntity.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/TestPersistenceUnitUtil.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/TestPersistenceUnitUtil.java?rev=799425&r1=799424&r2=799425&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/TestPersistenceUnitUtil.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/TestPersistenceUnitUtil.java Thu Jul 30 19:34:33 2009
@@ -19,15 +19,21 @@
 package org.apache.openjpa.persistence.util;
 
 import java.sql.Date;
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.Random;
 
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
 import javax.persistence.PersistenceUnitUtil;
+import javax.persistence.PersistenceUtil;
 import javax.persistence.spi.LoadState;
 import javax.persistence.spi.PersistenceProvider;
 import javax.persistence.spi.ProviderUtil;
 
+import org.apache.openjpa.persistence.OpenJPAEntityManagerFactorySPI;
+import org.apache.openjpa.persistence.OpenJPAPersistence;
 import org.apache.openjpa.persistence.PersistenceProviderImpl;
 import org.apache.openjpa.persistence.test.SingleEMFTestCase;
 
@@ -35,7 +41,9 @@
     
     public void setUp() {
         setUp(CLEAR_TABLES, EagerEntity.class, LazyEmbed.class,
-            LazyEntity.class, EagerEmbed.class);
+            LazyEntity.class, EagerEmbed.class, RelEntity.class,
+            EagerEmbedRel.class, MapEntity.class,
+            MapKeyEmbed.class, MapValEntity.class);
     }
 
     /*
@@ -69,6 +77,85 @@
     public void testNotLoadedEager() {
         verifyIsLoadedEagerState(false);       
     }
+    
+    /**
+     * Verifies the use of PersistenceUnitUtil with multiple PU's.
+     */
+    public void testMultiplePUs() {
+        OpenJPAEntityManagerFactorySPI emf1 =
+            (OpenJPAEntityManagerFactorySPI)OpenJPAPersistence.
+            createEntityManagerFactory("PUtil1",
+                "org/apache/openjpa/persistence/util/" +
+                "persistence.xml");
+        assertNotNull(emf1);
+
+        OpenJPAEntityManagerFactorySPI emf2 =
+            (OpenJPAEntityManagerFactorySPI)OpenJPAPersistence.
+            createEntityManagerFactory("PUtil2",
+                "org/apache/openjpa/persistence/util/" +
+                "persistence.xml");
+        
+        assertNotNull(emf2);
+        assertNotSame(emf, emf1);
+        assertNotSame(emf1, emf2);
+
+        PersistenceUnitUtil puu = emf.getPersistenceUnitUtil();
+        PersistenceUnitUtil puu1 = emf1.getPersistenceUnitUtil();
+        PersistenceUnitUtil puu2 = emf2.getPersistenceUnitUtil();
+
+        assertNotSame(puu, puu1);
+        assertNotSame(puu, puu2);
+        assertNotSame(puu1, puu2);
+
+        EntityManager em = emf.createEntityManager();
+        EntityManager em1 = emf1.createEntityManager();
+        EntityManager em2 = emf2.createEntityManager();
+
+        verifyPULoadState(em, puu, puu1, puu2);
+        verifyPULoadState(em1, puu1, puu, puu2);
+        verifyPULoadState(em2, puu2, puu, puu1);
+        
+        em.close();
+        em1.close();
+        em2.close();
+        
+        if (emf1 != null) {
+            emf1.close();
+        }
+        if (emf2 != null) {
+            emf2.close();
+        }
+        
+    }
+
+    private void verifyPULoadState(EntityManager em,
+        PersistenceUnitUtil...puu) {
+
+        EagerEntity ee = createEagerEntity();       
+        assertEquals(false, puu[0].isLoaded(ee));
+        assertEquals(false, puu[0].isLoaded(ee, 
+            "id"));
+        assertEquals(false, puu[1].isLoaded(ee));
+        assertEquals(false, puu[1].isLoaded(ee, 
+            "id"));
+        assertEquals(false, puu[2].isLoaded(ee));
+        assertEquals(false, puu[2].isLoaded(ee, 
+            "id"));
+        
+        em.getTransaction().begin();
+        em.persist(ee);
+        em.getTransaction().commit();
+
+        assertEquals(true, puu[0].isLoaded(ee));
+        assertEquals(true, puu[0].isLoaded(ee, 
+            "id"));
+        assertEquals(false, puu[1].isLoaded(ee));
+        assertEquals(false, puu[1].isLoaded(ee, 
+            "id"));
+        assertEquals(false, puu[2].isLoaded(ee));
+        assertEquals(false, puu[2].isLoaded(ee, 
+            "id"));
+    }
 
     
     private void verifyIsLoadedEagerState(boolean loaded) {
@@ -163,7 +250,52 @@
         
         em.close();
     }
+
+    public void testPCMapEager() {        
+        PersistenceUnitUtil puu = emf.getPersistenceUnitUtil();
+        EntityManager em = emf.createEntityManager();
+        
+        MapValEntity mve = new MapValEntity();
+        mve.setIntVal(10);
+        MapKeyEmbed mke = new MapKeyEmbed();
+        mke.setFirstName("Jane");
+        mke.setLastName("Doe");
+        
+        MapEntity me = new MapEntity();
+
+        assertEquals(false, puu.isLoaded(me));
+        assertEquals(false, puu.isLoaded(me, 
+            "mapValEntity"));
+        assertEquals(false, puu.isLoaded(me, 
+            "mapEntities"));
+
+        assertEquals(false, puu.isLoaded(mve));
+
+        // Create a circular ref
+        me.setMapValEntity(mve);
+        mve.setMapEntity(me);
+
+        HashMap<MapKeyEmbed, MapValEntity> hm = 
+            new HashMap<MapKeyEmbed, MapValEntity>();
+        
+        hm.put(mke, mve);
+        me.setMapEntities(hm);
+
+        em.getTransaction().begin();
+        em.persist(me);
+        em.getTransaction().commit();
         
+        assertEquals(true, puu.isLoaded(me));
+        assertEquals(true, puu.isLoaded(me, 
+            "mapValEntity"));
+        assertEquals(true, puu.isLoaded(me, 
+            "mapEntities"));
+
+        assertEquals(true, puu.isLoaded(mve));
+        
+        em.close();
+    }
+
     private EagerEntity createEagerEntity() {
         EagerEntity ee = new EagerEntity();
         ee.setId(new Random().nextInt());
@@ -188,6 +320,10 @@
         emb.setEndDate(new Date(System.currentTimeMillis()));
         emb.setStartDate(new Date(System.currentTimeMillis()));
         le.setLazyEmbed(emb);
+        RelEntity re = new RelEntity();
+        re.setName("My ent");
+        ArrayList<RelEntity> rel = new ArrayList<RelEntity>();
+        rel.add(new RelEntity());
         return le;
     }
     

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/TestPersistenceUtil.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/TestPersistenceUtil.java?rev=799425&r1=799424&r2=799425&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/TestPersistenceUtil.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/TestPersistenceUtil.java Thu Jul 30 19:34:33 2009
@@ -19,6 +19,8 @@
 package org.apache.openjpa.persistence.util;
 
 import java.sql.Date;
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.Random;
 
 import javax.persistence.EntityManager;
@@ -35,7 +37,8 @@
     
     public void setUp() {
         setUp(CLEAR_TABLES, EagerEntity.class, LazyEmbed.class,
-            LazyEntity.class, EagerEmbed.class);
+            LazyEntity.class, EagerEmbed.class, EagerEmbedRel.class,
+            RelEntity.class);
     }
 
     /*
@@ -187,6 +190,11 @@
         emb.setEndDate(new Date(System.currentTimeMillis()));
         emb.setStartDate(new Date(System.currentTimeMillis()));
         le.setLazyEmbed(emb);
+        RelEntity re = new RelEntity();
+        re.setName("My ent");
+        ArrayList<RelEntity> rel = new ArrayList<RelEntity>();
+        rel.add(new RelEntity());
+        le.setRelEntities(rel);
         return le;
     }
     

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/TestProviderUtil.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/TestProviderUtil.java?rev=799425&r1=799424&r2=799425&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/TestProviderUtil.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/TestProviderUtil.java Thu Jul 30 19:34:33 2009
@@ -19,7 +19,12 @@
 package org.apache.openjpa.persistence.util;
 
 import java.sql.Date;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
 import java.util.Random;
+import java.util.Set;
 
 import javax.persistence.EntityManager;
 import javax.persistence.spi.LoadState;
@@ -33,7 +38,8 @@
     
     public void setUp() {
         setUp(CLEAR_TABLES, EagerEntity.class, LazyEmbed.class,
-            LazyEntity.class, EagerEmbed.class);
+            LazyEntity.class, EagerEmbed.class, EagerEmbedRel.class,
+            RelEntity.class);
     }
 
     /*
@@ -72,7 +78,7 @@
     private void verifyIsLoadedEagerState(LoadState state) {
         ProviderUtil pu = getProviderUtil();
         EntityManager em = emf.createEntityManager();
-        EagerEntity ee = createEagerEntity();
+        EagerEntity ee = createEagerEntity(true);
         
         // Vfy LoadState is unknown for the unmanaged entity
         assertEquals(LoadState.UNKNOWN, pu.isLoaded(ee));
@@ -104,6 +110,10 @@
             "eagerEmbed"));
         assertEquals(state, pu.isLoadedWithoutReference(ee,
             "eagerEmbed"));
+        assertEquals(state, pu.isLoadedWithReference(ee, 
+            "eagerEmbedColl"));
+        assertEquals(state, pu.isLoadedWithoutReference(ee,
+            "eagerEmbedColl"));
         assertEquals(LoadState.UNKNOWN, pu.isLoadedWithReference(ee, 
             "transField"));
         assertEquals(LoadState.UNKNOWN, pu.isLoadedWithoutReference(ee,
@@ -149,6 +159,11 @@
             "lazyEmbed"));
         assertEquals(state, pu.isLoadedWithoutReference(le,
             "lazyEmbed"));
+        // lazyEmbedColl is lazy fetch so it should not be loaded
+        assertEquals(LoadState.NOT_LOADED, pu.isLoadedWithReference(le, 
+            "lazyEmbedColl"));
+        assertEquals(LoadState.NOT_LOADED, pu.isLoadedWithoutReference(le,
+            "lazyEmbedColl"));        
         assertEquals(LoadState.UNKNOWN, pu.isLoadedWithReference(le, 
             "transField"));
         assertEquals(LoadState.UNKNOWN, pu.isLoadedWithoutReference(le,
@@ -164,7 +179,7 @@
     public void testIsApplicationLoaded() {
         ProviderUtil pu = getProviderUtil();
         EntityManager em = emf.createEntityManager();
-        EagerEntity ee = createEagerEntity();
+        EagerEntity ee = createEagerEntity(true);
         
         em.getTransaction().begin();
         em.persist(ee);
@@ -202,15 +217,30 @@
             "id"));        
     }
 
-    private EagerEntity createEagerEntity() {
+    private EagerEntity createEagerEntity(boolean createRels) {
         EagerEntity ee = new EagerEntity();
         ee.setId(new Random().nextInt());
         ee.setName("EagerEntity");
         EagerEmbed emb = createEagerEmbed();
+        List<EagerEmbed> embcoll = createEagerEmbedColl();
         ee.setEagerEmbed(emb);
+        ee.setEagerEmbedColl(embcoll);
+        if (createRels) {
+            EagerEmbedRel eer = createEagerEmbedRel(createRels);
+            ee.setEagerEmbedRel(eer);
+        }
+        ee.setEagerEmbedRel(null);
         return ee;
     }
 
+    private List<EagerEmbed> createEagerEmbedColl() {
+        ArrayList<EagerEmbed> al = new ArrayList<EagerEmbed>();
+        for (int i = 0; i < 5; i++) {
+            al.add(createEagerEmbed());
+        }
+        return al;
+    }
+    
     private EagerEmbed createEagerEmbed() {
         EagerEmbed emb = new EagerEmbed();
         emb.setEndDate(new Date(System.currentTimeMillis()));
@@ -218,17 +248,49 @@
         return emb;
     }
 
+    private EagerEmbedRel createEagerEmbedRel(boolean createRels) {
+        EagerEmbedRel emb = new EagerEmbedRel();
+        Set<EagerEntity> ee = new HashSet<EagerEntity>();
+        if (createRels) {
+            ee.add(createEagerEntity(false));
+            ee.add(createEagerEntity(false));
+            ee.add(createEagerEntity(false));
+        }
+        Set<Integer> ints = new HashSet<Integer>();
+        for (int i = 0; i < 12; i++) {
+            ints.add(new Integer(i));
+        }
+        emb.setIntVals(ints);
+        
+        emb.setEagerEnts(ee);
+        return emb;
+    }
+
     private LazyEntity createLazyEntity() {
         LazyEntity le = new LazyEntity();
         le.setId(new Random().nextInt());
         le.setName("LazyEntity");
+        LazyEmbed emb = createLazyEmbed();
+        le.setLazyEmbed(emb);
+        le.setLazyEmbedColl(createLazyEmbedColl());
+        return le;
+    }
+
+    private LazyEmbed createLazyEmbed() {
         LazyEmbed emb = new LazyEmbed();
         emb.setEndDate(new Date(System.currentTimeMillis()));
         emb.setStartDate(new Date(System.currentTimeMillis()));
-        le.setLazyEmbed(emb);
-        return le;
+        return emb;
     }
-    
+
+    private List<LazyEmbed> createLazyEmbedColl() {
+        ArrayList<LazyEmbed> al = new ArrayList<LazyEmbed>();
+        for (int i = 0; i < 5; i++) {
+            al.add(createLazyEmbed());
+        }
+        return al;
+    }
+
     private void assertEagerLoadState(ProviderUtil pu, Object ent, 
         LoadState state) {
         assertEquals(state, pu.isLoaded(ent));
@@ -244,6 +306,10 @@
             "eagerEmbed"));
         assertEquals(state, pu.isLoadedWithoutReference(ent,
             "eagerEmbed"));
+        assertEquals(state, pu.isLoadedWithReference(ent, 
+            "eagerEmbedRel"));
+        assertEquals(state, pu.isLoadedWithoutReference(ent,
+            "eagerEmbedRel"));
         assertEquals(LoadState.UNKNOWN, pu.isLoadedWithReference(ent, 
             "transField"));
         assertEquals(LoadState.UNKNOWN, pu.isLoadedWithoutReference(ent,

Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/org/apache/openjpa/persistence/util/persistence.xml
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/org/apache/openjpa/persistence/util/persistence.xml?rev=799425&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/org/apache/openjpa/persistence/util/persistence.xml (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/org/apache/openjpa/persistence/util/persistence.xml Thu Jul 30 19:34:33 2009
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+ 
+ http://www.apache.org/licenses/LICENSE-2.0
+ 
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.   
+-->
+<persistence xmlns="http://java.sun.com/xml/ns/persistence"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    version="2.0">
+    
+    <persistence-unit name="PUtil1">
+        <class>org.apache.openjpa.persistence.util.EagerEntity</class>
+        <class>org.apache.openjpa.persistence.util.LazyEmbed</class>
+        <class>org.apache.openjpa.persistence.util.LazyEntity</class>
+        <class>org.apache.openjpa.persistence.util.EagerEmbed</class>
+        <class>org.apache.openjpa.persistence.util.RelEntity</class>
+        <class>org.apache.openjpa.persistence.util.EagerEmbedRel</class>
+        <properties>
+            <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema"/>    
+        </properties>
+        
+    </persistence-unit>
+
+    <persistence-unit name="PUtil2">
+        <class>org.apache.openjpa.persistence.util.EagerEntity</class>
+        <class>org.apache.openjpa.persistence.util.LazyEmbed</class>
+        <class>org.apache.openjpa.persistence.util.LazyEntity</class>
+        <class>org.apache.openjpa.persistence.util.EagerEmbed</class>
+        <class>org.apache.openjpa.persistence.util.RelEntity</class>
+        <class>org.apache.openjpa.persistence.util.EagerEmbedRel</class>
+        <properties>
+            <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema"/>    
+        </properties>
+    </persistence-unit>    
+</persistence>
\ No newline at end of file

Propchange: openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/org/apache/openjpa/persistence/util/persistence.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/OpenJPAPersistenceUtil.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/OpenJPAPersistenceUtil.java?rev=799425&r1=799424&r2=799425&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/OpenJPAPersistenceUtil.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/OpenJPAPersistenceUtil.java Thu Jul 30 19:34:33 2009
@@ -20,6 +20,8 @@
 
 import java.util.BitSet;
 import java.util.Collection;
+import java.util.HashSet;
+import java.util.Map;
 
 import javax.persistence.spi.LoadState;
 
@@ -29,6 +31,9 @@
 import org.apache.openjpa.kernel.Broker;
 import org.apache.openjpa.kernel.OpenJPAStateManager;
 import org.apache.openjpa.meta.FieldMetaData;
+import org.apache.openjpa.meta.JavaTypes;
+import org.apache.openjpa.meta.ValueMetaData;
+import org.apache.openjpa.util.ImplHelper;
 
 public class OpenJPAPersistenceUtil {
 
@@ -95,9 +100,14 @@
             // Cycle through all brokers managed by this factory.  
             Broker[] brokerArr = brokers.toArray(new Broker[brokers.size()]);
             for (Broker broker : brokerArr) {
-                if (broker != null && !broker.isClosed() && 
-                    broker.isPersistent(entity))
-                    return true;
+                if (broker != null && !broker.isClosed())
+                    if (ImplHelper.isManageable(entity)) {
+                        PersistenceCapable pc = (PersistenceCapable)entity;
+                        // Vfy this broker is managing the entity
+                        if (pc.pcGetGenericContext() == broker) {
+                            return true;
+                        }
+                    }
             }
         }
         return false;
@@ -146,13 +156,14 @@
             }
             StateManager sm = pc.pcGetStateManager();
             if (sm != null && sm instanceof OpenJPAStateManager) {
-                return isLoaded((OpenJPAStateManager)sm, attr);
+                return isLoaded((OpenJPAStateManager)sm, attr, null);
             }
         }        
         return LoadState.UNKNOWN;
     }
 
-    private static LoadState isLoaded(OpenJPAStateManager sm, String attr) {
+    private static LoadState isLoaded(OpenJPAStateManager sm, String attr, 
+        HashSet<OpenJPAStateManager> pcs) {
         boolean isLoaded = true;
         BitSet loadSet = sm.getLoaded();
         if (attr != null) {
@@ -168,15 +179,160 @@
         }
         FieldMetaData[] fmds = sm.getMetaData().getFields();
         // Check load state of all persistent eager fetch attributes
-        for (FieldMetaData fmd : fmds) {
-            if (fmd.isInDefaultFetchGroup()) {
-                if (!loadSet.get(fmd.getIndex())) {
-                    isLoaded = false;
-                    break;
+        if (fmds != null && fmds.length > 0) {
+            pcs = addToLoadSet(pcs, sm);
+            for (FieldMetaData fmd : fmds) {
+                if (fmd.isInDefaultFetchGroup()) {
+                    if (!isLoadedField(sm, fmd, pcs)) {
+                        isLoaded = false;
+                        break;
+                    }
                 }
-                // TODO: Complete contract for collections
             }
-        } 
+            pcs.remove(sm);
+        }
         return isLoaded ? LoadState.LOADED : LoadState.NOT_LOADED;        
     }
+    
+    private static HashSet<OpenJPAStateManager> addToLoadSet(
+        HashSet<OpenJPAStateManager> pcs, OpenJPAStateManager sm) {
+        if (pcs == null) {
+            pcs = new HashSet<OpenJPAStateManager>();
+        }
+        pcs.add(sm);
+        return pcs;
+    }
+
+    private static boolean isLoadedField(OpenJPAStateManager sm,
+        FieldMetaData fmd, HashSet<OpenJPAStateManager> pcs) {
+        BitSet loadSet = sm.getLoaded();
+                
+        // Simple load state check for the field
+        if (!loadSet.get(fmd.getIndex()))
+            return false;
+
+        Object field = sm.fetchField(fmd.getIndex(), false);
+
+        // Get the state manager for the field, if it is a PC
+        OpenJPAStateManager ofsm = getStateManager(field);
+
+        // Prevent circular load state evaluation for this sm.
+        if (ofsm != null && pcs.contains(ofsm))
+            return true;
+        
+        // If a collection type, determine if it is loaded
+        switch (fmd.getDeclaredTypeCode()) {
+            case JavaTypes.COLLECTION:   
+                return isLoadedCollection(sm, fmd.getElement(), 
+                    (Collection<?>)field, pcs);
+            case JavaTypes.MAP:
+                return isLoadedMap(sm, fmd, 
+                    (Map<?,?>)field, pcs);
+            case JavaTypes.ARRAY:
+                return isLoadedArray(sm, fmd.getElement(), 
+                    (Object[])field, pcs);
+        }
+        // If other PC type, determine if it is loaded
+        if (ofsm != null && fmd.isDeclaredTypePC()) {
+            return isLoaded(ofsm, null, pcs) ==
+                LoadState.LOADED;
+        }
+
+        return true;
+    } 
+    
+    private static boolean isLoadedCollection(OpenJPAStateManager sm, 
+        ValueMetaData vmd, Collection<?> coll, HashSet<OpenJPAStateManager> pcs) {
+        
+        // This field passed the load state check in isLoadedField, so
+        // if any of these conditions are true the collection is loaded.
+        if (sm == null || coll == null || coll.size() == 0) {
+            return true;
+        }
+        
+        // Convert to array to prevent concurrency issues
+        Object[] arr = coll.toArray();
+
+        return isLoadedArray(sm, vmd, arr, pcs);
+    }
+
+    private static boolean isLoadedArray(OpenJPAStateManager sm, 
+        ValueMetaData vmd, Object[] arr, 
+        HashSet<OpenJPAStateManager> pcs) {
+
+        // This field passed the load state check in isLoadedField, so
+        // if any of these conditions are true the array is loaded.
+        if (sm == null || arr == null || arr.length == 0) {
+            return true;
+        }
+
+        // Not a collection of PC's 
+        if (!vmd.isDeclaredTypePC()) {
+          return true;
+        }
+        
+        for (Object pc : arr) {
+            OpenJPAStateManager esm = getStateManager(pc);
+            if (esm == null) {
+                return true;
+            }
+            if (!(isLoaded(esm, null, pcs) == LoadState.LOADED))
+                return false;
+        }
+        return true;
+    }
+
+    private static boolean isLoadedMap(OpenJPAStateManager sm, 
+        FieldMetaData fmd, Map<?,?> map, HashSet<OpenJPAStateManager> pcs) {
+                
+        // This field passed the load state check in isLoadedField, so
+        // if any of these conditions are true the map is loaded.
+        if (sm == null || map == null || map.size() == 0) {
+            return true;
+        }
+
+        boolean keyIsPC = fmd.getKey().isDeclaredTypePC();
+        boolean valIsPC = fmd.getElement().isDeclaredTypePC();
+
+        // Map is does not contain PCs in either keys or values
+        if (!(keyIsPC || valIsPC)) {
+          return true;
+        }
+        
+        Object[] arr = map.keySet().toArray();
+
+        for (Object key : arr) {
+            if (keyIsPC) {
+                OpenJPAStateManager ksm = getStateManager(key);
+                if (ksm == null) {
+                    return true;
+                }                        
+                if (!(isLoaded(ksm, null, pcs) == LoadState.LOADED))
+                    return false;
+            }
+            if (valIsPC) {
+                Object value = map.get(key);
+                OpenJPAStateManager vsm = getStateManager(value);
+                if (vsm == null) {
+                    return true;
+                }                        
+                if (!(isLoaded(vsm, null, pcs) == LoadState.LOADED))
+                    return false;                    
+            }
+        }
+        return true;
+    }
+
+    private static OpenJPAStateManager getStateManager(Object obj) {        
+        if (obj == null || !(obj instanceof PersistenceCapable)) {
+            return null;
+        }
+        
+        PersistenceCapable pc = (PersistenceCapable)obj;
+        StateManager sm = pc.pcGetStateManager();
+        if (sm == null || !(sm instanceof OpenJPAStateManager)) {
+            return null;
+        }
+        return (OpenJPAStateManager)sm;
+    }
 }

Modified: openjpa/trunk/openjpa-project/src/doc/manual/jpa_overview_emfactory.xml
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-project/src/doc/manual/jpa_overview_emfactory.xml?rev=799425&r1=799424&r2=799425&view=diff
==============================================================================
--- openjpa/trunk/openjpa-project/src/doc/manual/jpa_overview_emfactory.xml (original)
+++ openjpa/trunk/openjpa-project/src/doc/manual/jpa_overview_emfactory.xml Thu Jul 30 19:34:33 2009
@@ -427,4 +427,44 @@
 IllegalStateException</classname>.
         </para>
     </section>
+
+
+    <section id="jpa_overview_emfactory_puutil">
+        <title>
+            PersistenceUnitUtil
+        </title>
+        <indexterm zone="jpa_overview_emfactory_puutil">
+            <primary>
+                EntityManagerFactory
+            </primary>
+            <secondary>
+                util
+            </secondary>
+        </indexterm>
+<programlisting>
+public PersistenceUnitUtil getPersistenceUnitUtil();
+</programlisting>
+        <para>
+The <classname>EntityManagerFactory</classname> method 
+<methodname>getPersistenceUnitUtil</methodname> to provide access to a 
+<classname>PersistenceUnitUtil</classname> utility. <classname>PersistenceUnitUtil</classname>
+can be used to obtain the identity of a managed object and determine the load
+state of the entity or one of its attributes.  If the object is not
+managed by one of the entity managers created from the entity manager factory 
+from which the utility was obtained, the <methodname>getIdentifier</methodname> method will
+return null and the <methodname>isLoaded</methodname> methods will return false.
+<programlisting>
+EntityManagerFactory emf = Persistence.createEntityManagerFactory();
+PersistenceUnitUtil puUtil = emf.getPersistenceUnitUtil();
+
+if (puUtil.getIdentifier(deptEntity) == null) {
+    throw new Exception("Identity is not valid.");
+}
+if (!puUtil.isLoaded(deptEntity, "employees")) {
+    throw new Exception("Employees not loaded.")
+}
+</programlisting>
+        </para>
+    </section>
+
 </chapter>

Modified: openjpa/trunk/openjpa-project/src/doc/manual/jpa_overview_persistence.xml
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-project/src/doc/manual/jpa_overview_persistence.xml?rev=799425&r1=799424&r2=799425&view=diff
==============================================================================
--- openjpa/trunk/openjpa-project/src/doc/manual/jpa_overview_persistence.xml (original)
+++ openjpa/trunk/openjpa-project/src/doc/manual/jpa_overview_persistence.xml Thu Jul 30 19:34:33 2009
@@ -75,6 +75,7 @@
 <programlisting>
 public static EntityManagerFactory createEntityManagerFactory(String name);
 public static EntityManagerFactory createEntityManagerFactory(String name, Map props);
+public static PersistenceUtil getPersistenceUtil();
 </programlisting>
     <para>
 Each <methodname>createEntityManagerFactory</methodname> method searches the
@@ -93,6 +94,18 @@
 EntityManagerFactory</classname> definition in <filename>
 conf/META-INF/persistence.xml</filename>.
     </para>
+    <para>
+The <methodname>getPersistenceUtil</methodname> method returns a PersistenceUtil
+interface that can be used to determine whether an entity or attribute of an
+entity is loaded.  
+</para>
+<programlisting>
+PersistenceUtil pUtil = Persistence.getPersistenceUtil();
+
+if (!pUtil.isLoaded(myEntity)) {
+    loadEntity(myEntity);
+}
+</programlisting>
     <section id="jpa_overview_persistence_xml">
         <title>
             persistence.xml