You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2006/11/30 12:40:58 UTC

svn commit: r480896 - in /incubator/cayenne/main/trunk/core/cayenne-jpa: ./ src/main/java/org/apache/cayenne/jpa/bridge/ src/main/java/org/apache/cayenne/jpa/conf/ src/main/java/org/apache/cayenne/jpa/cspi/ src/main/java/org/apache/cayenne/jpa/map/ src...

Author: aadamchik
Date: Thu Nov 30 03:40:56 2006
New Revision: 480896

URL: http://svn.apache.org/viewvc?view=rev&rev=480896
Log:
CAY-713: Improved Meaningful PK support
(CAY-713 accomplished 
+ switching JPA enhancer to the new generic pojo enhancement code
+ uncommenting a number of JPA relationship itests that work now with the new enhancer)

Removed:
    incubator/cayenne/main/trunk/core/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/AnnotationMappingAssertion.java
Modified:
    incubator/cayenne/main/trunk/core/cayenne-jpa/.classpath
    incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/DataMapConverter.java
    incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapAnnotationLoader.java
    incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapDefaultsProcessor.java
    incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaAccessorVisitor.java
    incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaEnhancerVisitorFactory.java
    incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/map/JpaClassDescriptor.java
    incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/reflect/CjpaClassDescriptorFactory.java
    incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/reflect/CjpaToManyProperty.java
    incubator/cayenne/main/trunk/core/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/bridge/DataMapMappingAssertion.java
    incubator/cayenne/main/trunk/core/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/EntityMapAnnotationLoaderTest.java
    incubator/cayenne/main/trunk/core/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/map/JpaClassDescriptorTest.java

Modified: incubator/cayenne/main/trunk/core/cayenne-jpa/.classpath
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jpa/.classpath?view=diff&rev=480896&r1=480895&r2=480896
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jpa/.classpath (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jpa/.classpath Thu Nov 30 03:40:56 2006
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
 	<classpathentry kind="src" path="src/main/java"/>
-	<classpathentry output="target/test-classes" kind="src" path="src/test/java"/>
+	<classpathentry kind="src" path="src/test/java"/>
 	<classpathentry excluding="**" output="src/main/resources" kind="src" path="src/main/resources"/>
 	<classpathentry excluding="**" output="src/test/resources" kind="src" path="src/test/resources"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>

Modified: incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/DataMapConverter.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/DataMapConverter.java?view=diff&rev=480896&r1=480895&r2=480896
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/DataMapConverter.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/DataMapConverter.java Thu Nov 30 03:40:56 2006
@@ -33,6 +33,7 @@
 import org.apache.cayenne.jpa.map.JpaEntityMap;
 import org.apache.cayenne.jpa.map.JpaId;
 import org.apache.cayenne.jpa.map.JpaJoinColumn;
+import org.apache.cayenne.jpa.map.JpaManagedClass;
 import org.apache.cayenne.jpa.map.JpaManyToMany;
 import org.apache.cayenne.jpa.map.JpaManyToOne;
 import org.apache.cayenne.jpa.map.JpaNamedQuery;
@@ -107,10 +108,6 @@
 
     class JpaBasicVisitor extends NestedVisitor {
 
-        JpaBasicVisitor() {
-            addChildVisitor(JpaColumn.class, new JpaColumnVisitor());
-        }
-
         @Override
         Object createObject(ProjectPath path) {
 
@@ -125,11 +122,20 @@
 
             parentCayenneEntity.addAttribute(cayenneAttribute);
             return cayenneAttribute;
-
         }
 
         Class getAttributeType(ProjectPath path, String name) {
-            AccessType access = ((JpaEntityMap) path.getRoot()).getAccess();
+            AccessType access = null;
+
+            JpaManagedClass entity = (JpaManagedClass) path
+                    .firstInstanceOf(JpaManagedClass.class);
+            access = entity.getAccess();
+
+            if (access == null) {
+                JpaEntityMap map = (JpaEntityMap) path
+                        .firstInstanceOf(JpaEntityMap.class);
+                access = map.getAccess();
+            }
 
             Class objectClass = ((ObjEntity) targetPath.firstInstanceOf(ObjEntity.class))
                     .getJavaClass();
@@ -146,7 +152,9 @@
                 throw new JpaProviderException("Error resolving attribute '"
                         + name
                         + "', access type:"
-                        + access, e);
+                        + access
+                        + ", class: "
+                        + objectClass.getName(), e);
             }
         }
 
@@ -237,6 +245,24 @@
         }
     }
 
+    class JpaIdVisitor extends JpaBasicVisitor {
+
+        @Override
+        Object createObject(ProjectPath path) {
+
+            JpaId id = (JpaId) path.getObject();
+
+            ObjEntity parentCayenneEntity = (ObjEntity) targetPath.getObject();
+
+            ObjAttribute cayenneAttribute = new ObjAttribute(id.getName());
+            cayenneAttribute.setType(getAttributeType(path, id.getName()).getName());
+            cayenneAttribute.setDbAttributeName(id.getColumn().getName());
+
+            parentCayenneEntity.addAttribute(cayenneAttribute);
+            return cayenneAttribute;
+        }
+    }
+
     class JpaIdColumnVisitor extends BaseTreeVisitor {
 
         @Override
@@ -349,10 +375,16 @@
             attributeVisitor.addChildVisitor(
                     JpaManyToMany.class,
                     new JpaRelationshipVisitor());
-            attributeVisitor.addChildVisitor(JpaBasic.class, new JpaBasicVisitor());
-            attributeVisitor.addChildVisitor(JpaVersion.class, new JpaVersionVisitor());
 
-            BaseTreeVisitor idVisitor = new BaseTreeVisitor();
+            JpaBasicVisitor basicVisitor = new JpaBasicVisitor();
+            basicVisitor.addChildVisitor(JpaColumn.class, new JpaColumnVisitor());
+            attributeVisitor.addChildVisitor(JpaBasic.class, basicVisitor);
+
+            JpaVersionVisitor versionVisitor = new JpaVersionVisitor();
+            versionVisitor.addChildVisitor(JpaColumn.class, new JpaColumnVisitor());
+            attributeVisitor.addChildVisitor(JpaVersion.class, versionVisitor);
+
+            JpaIdVisitor idVisitor = new JpaIdVisitor();
             idVisitor.addChildVisitor(JpaColumn.class, new JpaIdColumnVisitor());
             attributeVisitor.addChildVisitor(JpaId.class, idVisitor);
 

Modified: incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapAnnotationLoader.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapAnnotationLoader.java?view=diff&rev=480896&r1=480895&r2=480896
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapAnnotationLoader.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapAnnotationLoader.java Thu Nov 30 03:40:56 2006
@@ -65,6 +65,7 @@
 import javax.persistence.Version;
 
 import org.apache.cayenne.jpa.JpaProviderException;
+import org.apache.cayenne.jpa.map.AccessType;
 import org.apache.cayenne.jpa.map.JpaAbstractEntity;
 import org.apache.cayenne.jpa.map.JpaAttribute;
 import org.apache.cayenne.jpa.map.JpaClassDescriptor;
@@ -177,9 +178,11 @@
         // per 'getAnnotations' docs, array is returned by copy, so we can modify it...
         Arrays.sort(classAnnotations, typeAnnotationsSorter);
 
-        JpaClassDescriptor descriptor = new JpaClassDescriptor(
-                context.getEntityMap(),
-                managedClass);
+        JpaClassDescriptor descriptor = new JpaClassDescriptor(managedClass);
+        
+        // initially set access to the map level access - may be overriden below
+        descriptor.setAccess(context.getEntityMap().getAccess());
+        
         AnnotationContext stack = new AnnotationContext(descriptor);
         stack.push(context.getEntityMap());
 
@@ -214,14 +217,43 @@
         // we still must determine the access type to apply default mappping rules. How?
         // (using FIELD access for now).
 
+        boolean fieldAccess = false;
+
         for (JpaPropertyDescriptor property : descriptor.getFieldDescriptors()) {
             stack.setPropertyDescriptor(property);
-            applyMemberAnnotations(property, stack);
+            if (applyMemberAnnotations(property, stack)) {
+                fieldAccess = true;
+            }
         }
 
+        boolean propertyAccess = false;
+
         for (JpaPropertyDescriptor property : descriptor.getPropertyDescriptors()) {
             stack.setPropertyDescriptor(property);
-            applyMemberAnnotations(property, stack);
+            if (applyMemberAnnotations(property, stack)) {
+                propertyAccess = true;
+            }
+        }
+
+        if (stack.peek() instanceof JpaManagedClass) {
+            JpaManagedClass entity = (JpaManagedClass) stack.peek();
+            // sanity check
+            if (fieldAccess && propertyAccess) {
+                throw new JpaProviderException("Entity '"
+                        + entity.getClassName()
+                        + "' has both property and field annotations.");
+            }
+
+            // TODO: andrus - 11/29/2006 - clean this redundancy - access field should be
+            // stored either in the entity or the descriptor.
+            if (fieldAccess) {
+                descriptor.setAccess(AccessType.FIELD);
+                entity.setAccess(AccessType.FIELD);
+            }
+            else if (propertyAccess) {
+                descriptor.setAccess(AccessType.PROPERTY);
+                entity.setAccess(AccessType.PROPERTY);
+            }
         }
 
         // === pop class-level stuff
@@ -234,7 +266,11 @@
         }
     }
 
-    protected void applyMemberAnnotations(
+    /**
+     * Processes member annotations, returning true if at least one JPA annotation was
+     * found.
+     */
+    protected boolean applyMemberAnnotations(
             JpaPropertyDescriptor property,
             AnnotationProcessorStack stack) {
 
@@ -263,6 +299,8 @@
                 memberProcessor.onFinishElement(member, stack);
             }
         }
+
+        return annotations.length > 0;
     }
 
     protected void applyEntityCallbackAnnotations(

Modified: incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapDefaultsProcessor.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapDefaultsProcessor.java?view=diff&rev=480896&r1=480895&r2=480896
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapDefaultsProcessor.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapDefaultsProcessor.java Thu Nov 30 03:40:56 2006
@@ -126,8 +126,12 @@
             // * default persistent fields
             JpaClassDescriptor descriptor = entity.getClassDescriptor();
 
-            JpaEntityMap root = (JpaEntityMap) path.getRoot();
-            if (root.getAccess() == AccessType.PROPERTY) {
+            AccessType access = entity.getAccess();
+            if (access == null) {
+                access = ((JpaEntityMap) path.getRoot()).getAccess();
+            }
+
+            if (access == AccessType.PROPERTY) {
                 for (JpaPropertyDescriptor candidate : descriptor
                         .getPropertyDescriptors()) {
                     processProperty(entity, descriptor, candidate);

Modified: incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaAccessorVisitor.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaAccessorVisitor.java?view=diff&rev=480896&r1=480895&r2=480896
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaAccessorVisitor.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaAccessorVisitor.java Thu Nov 30 03:40:56 2006
@@ -19,14 +19,9 @@
 package org.apache.cayenne.jpa.cspi;
 
 import org.apache.cayenne.enhancer.AccessorVisitor;
-import org.apache.cayenne.enhancer.EnhancementHelper;
-import org.apache.cayenne.enhancer.GetterVisitor;
-import org.apache.cayenne.enhancer.SetterVisitor;
 import org.apache.cayenne.jpa.map.JpaClassDescriptor;
 import org.apache.cayenne.jpa.map.JpaPropertyDescriptor;
 import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Type;
 
 /**
  * @author Andrus Adamchik
@@ -34,55 +29,24 @@
 class CjpaAccessorVisitor extends AccessorVisitor {
 
     private JpaClassDescriptor descriptor;
-    private EnhancementHelper helper;
 
     public CjpaAccessorVisitor(ClassVisitor visitor, JpaClassDescriptor descriptor) {
         super(visitor);
         this.descriptor = descriptor;
-        this.helper = new EnhancementHelper(this);
     }
 
     @Override
-    public void visit(
-            int version,
-            int access,
-            String name,
-            String signature,
-            String superName,
-            String[] interfaces) {
-
-        helper.reset(name);
-        super.visit(version, access, name, signature, superName, interfaces);
+    protected boolean isEnhancedProperty(String property) {
+        return descriptor.getProperty(property) != null;
     }
 
     @Override
-    protected MethodVisitor visitGetter(
-            MethodVisitor mv,
-            String property,
-            Type propertyType) {
-
+    protected boolean isLazyFaulted(String property) {
         JpaPropertyDescriptor propertyDescriptor = descriptor.getProperty(property);
 
-        if (propertyDescriptor != null) {
-            // TODO: andrus, 10/14/2006 - this should access Jpa LAZY vs. EAGER falg
-            // instead of using Cayenne default logic of lazy relationships
-            boolean faulted = propertyDescriptor.getTargetEntityType() != null;
-
-            return new GetterVisitor(mv, helper, property, faulted);
-        }
-
-        return mv;
-    }
-
-    @Override
-    protected MethodVisitor visitSetter(
-            MethodVisitor mv,
-            String property,
-            Type propertyType) {
-        return (descriptor.getProperty(property) != null) ? new SetterVisitor(
-                mv,
-                helper,
-                property,
-                propertyType) : mv;
+        // TODO: andrus, 10/14/2006 - this should access Jpa LAZY vs. EAGER flag
+        // instead of using Cayenne default logic of lazy relationships
+        return propertyDescriptor != null
+                && propertyDescriptor.getTargetEntityType() != null;
     }
 }

Modified: incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaEnhancerVisitorFactory.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaEnhancerVisitorFactory.java?view=diff&rev=480896&r1=480895&r2=480896
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaEnhancerVisitorFactory.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaEnhancerVisitorFactory.java Thu Nov 30 03:40:56 2006
@@ -24,6 +24,7 @@
 import org.apache.cayenne.enhancer.PersistentInterfaceVisitor;
 import org.apache.cayenne.jpa.map.JpaClassDescriptor;
 import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.commons.SerialVersionUIDAdder;
 
 /**
  * Class enhancer used for JPA.
@@ -44,9 +45,17 @@
             return null;
         }
 
+        // from here the code is copied essentially verbatim
+        // from CayenneEnhancerVisitorFactory.
+
         // create enhancer chain
         PersistentInterfaceVisitor e1 = new PersistentInterfaceVisitor(out);
         CjpaAccessorVisitor e2 = new CjpaAccessorVisitor(e1, descriptor);
-        return e2;
+
+        // this ensures that both enhanced and original classes have compatible serialized
+        // format even if no serialVersionUID is defined by the user
+        SerialVersionUIDAdder e3 = new SerialVersionUIDAdder(e2);
+
+        return e3;
     }
 }

Modified: incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/map/JpaClassDescriptor.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/map/JpaClassDescriptor.java?view=diff&rev=480896&r1=480895&r2=480896
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/map/JpaClassDescriptor.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/map/JpaClassDescriptor.java Thu Nov 30 03:40:56 2006
@@ -45,7 +45,7 @@
     protected Collection<JpaPropertyDescriptor> fieldDescriptors;
     protected Collection<JpaPropertyDescriptor> propertyDescriptors;
     protected Class managedClass;
-    protected JpaEntityMap entityMap;
+    protected AccessType access;
 
     public static String propertyNameForGetter(String getterName) {
         Matcher getMatch = GETTER_PATTERN.matcher(getterName);
@@ -66,21 +66,20 @@
         return null;
     }
 
-    public JpaClassDescriptor(JpaEntityMap entityMap, Class managedClass) {
+    public JpaClassDescriptor(Class managedClass) {
         this.managedClass = managedClass;
-        this.entityMap = entityMap;
     }
 
     public Class getManagedClass() {
         return managedClass;
     }
 
-    public boolean isFieldAccess() {
-        return entityMap.getAccess() == AccessType.FIELD;
+    public AccessType getAccess() {
+        return access;
     }
-
-    public boolean isPropertyAccess() {
-        return entityMap.getAccess() == AccessType.PROPERTY;
+    
+    public void setAccess(AccessType access) {
+        this.access = access;
     }
 
     /**
@@ -89,14 +88,14 @@
      * PROPERTY access - descriptor is looked up in the list of class properties.
      */
     public JpaPropertyDescriptor getProperty(String name) {
-        if (isFieldAccess()) {
+        if (getAccess() == AccessType.FIELD) {
             for (JpaPropertyDescriptor d : getFieldDescriptors()) {
                 if (name.equals(d.getName())) {
                     return d;
                 }
             }
         }
-        else if (isPropertyAccess()) {
+        else if (getAccess() == AccessType.PROPERTY) {
             for (JpaPropertyDescriptor d : getPropertyDescriptors()) {
                 if (name.equals(d.getName())) {
                     return d;

Modified: incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/reflect/CjpaClassDescriptorFactory.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/reflect/CjpaClassDescriptorFactory.java?view=diff&rev=480896&r1=480895&r2=480896
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/reflect/CjpaClassDescriptorFactory.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/reflect/CjpaClassDescriptorFactory.java Thu Nov 30 03:40:56 2006
@@ -24,21 +24,12 @@
 import org.apache.cayenne.reflect.ClassDescriptor;
 import org.apache.cayenne.reflect.ClassDescriptorMap;
 import org.apache.cayenne.reflect.PersistentDescriptor;
-import org.apache.cayenne.reflect.PersistentDescriptorFactory;
+import org.apache.cayenne.reflect.pojo.EnhancedPojoDescriptorFactory;
 
-public class CjpaClassDescriptorFactory extends PersistentDescriptorFactory {
+public class CjpaClassDescriptorFactory extends EnhancedPojoDescriptorFactory {
 
     public CjpaClassDescriptorFactory(ClassDescriptorMap descriptorMap) {
         super(descriptorMap);
-    }
-
-    // TODO: andrus, 11/25/2006 - sniff enhanced objects, and skip the rest in
-    // 'getDescriptor'
-
-    @Override
-    protected void createToOneProperty(
-            PersistentDescriptor descriptor,
-            ObjRelationship relationship) {
     }
 
     @Override

Modified: incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/reflect/CjpaToManyProperty.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/reflect/CjpaToManyProperty.java?view=diff&rev=480896&r1=480895&r2=480896
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/reflect/CjpaToManyProperty.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/reflect/CjpaToManyProperty.java Thu Nov 30 03:40:56 2006
@@ -19,9 +19,6 @@
 
 package org.apache.cayenne.jpa.reflect;
 
-import org.apache.cayenne.Fault;
-import org.apache.cayenne.Persistent;
-import org.apache.cayenne.ValueHolder;
 import org.apache.cayenne.reflect.Accessor;
 import org.apache.cayenne.reflect.ClassDescriptor;
 import org.apache.cayenne.reflect.ListProperty;
@@ -40,26 +37,5 @@
     public void writePropertyDirectly(Object object, Object oldValue, Object newValue)
             throws PropertyException {
         accessor.setValue(object, newValue);
-    }
-
-    @Override
-    protected ValueHolder createCollectionValueHolder(Object object)
-            throws PropertyException {
-        if (!(object instanceof Persistent)) {
-
-            throw new PropertyException(
-                    "ValueHolders for non-persistent objects are not supported.",
-                    this,
-                    object);
-        }
-
-        return (ValueHolder) Fault.getToManyFault().resolveFault(
-                (Persistent) object,
-                getName());
-    }
-
-    @Override
-    public void invalidate(Object object) {
-        writePropertyDirectly(object, null, Fault.getToManyFault());
     }
 }

Modified: incubator/cayenne/main/trunk/core/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/bridge/DataMapMappingAssertion.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/bridge/DataMapMappingAssertion.java?view=diff&rev=480896&r1=480895&r2=480896
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/bridge/DataMapMappingAssertion.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/bridge/DataMapMappingAssertion.java Thu Nov 30 03:40:56 2006
@@ -98,7 +98,7 @@
     }
 
     protected void assertObjAttributes(ObjEntity entity1) {
-        assertEquals(3, entity1.getAttributeMap().size());
+        assertEquals(4, entity1.getAttributeMap().size());
 
         ObjAttribute a1 = (ObjAttribute) entity1.getAttribute("attribute1");
         assertNotNull(a1);
@@ -117,6 +117,10 @@
         assertEquals("attribute9", a3.getName());
         assertEquals("column9", a3.getDbAttributeName());
         assertEquals(Date.class.getName(), a3.getType());
+        
+        // PK must also be mapped
+        ObjAttribute id = (ObjAttribute) entity1.getAttribute("id");
+        assertNotNull(id);
     }
 
     protected void assertObjRelationships(ObjEntity entity1) {

Modified: incubator/cayenne/main/trunk/core/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/EntityMapAnnotationLoaderTest.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/EntityMapAnnotationLoaderTest.java?view=diff&rev=480896&r1=480895&r2=480896
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/EntityMapAnnotationLoaderTest.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/EntityMapAnnotationLoaderTest.java Thu Nov 30 03:40:56 2006
@@ -140,6 +140,6 @@
                 .getConflicts()
                 .hasFailures());
 
-        new AnnotationMappingAssertion().testEntityMap(context.getEntityMap());
+        new MappingAssertion().testEntityMap(context.getEntityMap());
     }
 }

Modified: incubator/cayenne/main/trunk/core/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/map/JpaClassDescriptorTest.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/map/JpaClassDescriptorTest.java?view=diff&rev=480896&r1=480895&r2=480896
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/map/JpaClassDescriptorTest.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/map/JpaClassDescriptorTest.java Thu Nov 30 03:40:56 2006
@@ -17,7 +17,6 @@
  *  under the License.
  ****************************************************************/
 
-
 package org.apache.cayenne.jpa.map;
 
 import junit.framework.TestCase;
@@ -41,11 +40,9 @@
 
     public void testGetMemberDescriptors() throws Exception {
 
-        JpaEntityMap map = new JpaEntityMap();
-        map.setAccess(AccessType.PROPERTY);
         JpaClassDescriptor descriptor = new JpaClassDescriptor(
-                map,
                 MockPropertyRegressionBean.class);
+        descriptor.setAccess(AccessType.PROPERTY);
 
         assertEquals(2, descriptor.getPropertyDescriptors().size());