You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by fa...@apache.org on 2009/03/05 15:51:54 UTC

svn commit: r750469 - in /openjpa/trunk/openjpa-persistence-jdbc/src: main/java/org/apache/openjpa/persistence/jdbc/ test/java/org/apache/openjpa/persistence/embed/attrOverrides/

Author: faywang
Date: Thu Mar  5 14:51:53 2009
New Revision: 750469

URL: http://svn.apache.org/viewvc?rev=750469&view=rev
Log:
OPENJPA-937: AssociationOverrides support when applied to 
MappedSuperclass.

Added:
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/AbstractEmployee.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/PartTimeEmployee.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/Project.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/TestAssocOverrides.java
Modified:
    openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/AnnotationPersistenceMappingParser.java
    openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/XMLPersistenceMappingParser.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/Address.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/PhoneNumber.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/TestAttrOverrides.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/TestAttrOverridesXml.java

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/AnnotationPersistenceMappingParser.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/AnnotationPersistenceMappingParser.java?rev=750469&r1=750468&r2=750469&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/AnnotationPersistenceMappingParser.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/AnnotationPersistenceMappingParser.java Thu Mar  5 14:51:53 2009
@@ -408,6 +408,7 @@
         JoinColumn[] scols;
         int unique;
         List<Column> jcols;
+        JoinTable joinTbl;
         for (AssociationOverride assoc : assocs) {
             if (StringUtils.isEmpty(assoc.name()))
                 throw new MetaDataException(_loc.get("no-override-name", cm));
@@ -416,16 +417,23 @@
                 sup = (FieldMapping) cm.addDefinedSuperclassField
                     (assoc.name(), Object.class, Object.class);
             scols = assoc.joinColumns();
-            if (scols == null || scols.length == 0)
-                continue;
+            joinTbl = assoc.joinTable();
+            if ((scols == null || scols.length == 0) && joinTbl == null)
+                //continue;
+                throw new MetaDataException(_loc.get("embed-override-name",
+                        sup, assoc.name()));
 
-            jcols = new ArrayList<Column>(scols.length);
-            unique = 0;
-            for (JoinColumn scol : scols) {
-                unique |= (scol.unique()) ? TRUE : FALSE;
-                jcols.add(newColumn(scol));
+            if (scols != null && scols.length > 0) {
+                jcols = new ArrayList<Column>(scols.length);
+                unique = 0;
+                for (JoinColumn scol : scols) {
+                    unique |= (scol.unique()) ? TRUE : FALSE;
+                    jcols.add(newColumn(scol));
+                }
+                setColumns(sup, sup.getValueInfo(), jcols, unique);
+            } else if (joinTbl != null) {
+                parseJoinTable(sup, joinTbl);
             }
-            setColumns(sup, sup.getValueInfo(), jcols, unique);
         }
     }
 

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/XMLPersistenceMappingParser.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/XMLPersistenceMappingParser.java?rev=750469&r1=750468&r2=750469&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/XMLPersistenceMappingParser.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/XMLPersistenceMappingParser.java Thu Mar  5 14:51:53 2009
@@ -288,6 +288,7 @@
             case DISCRIM_VAL:
                 endDiscriminatorValue();
                 break;
+            case ASSOC_OVERRIDE:                
             case ATTR_OVERRIDE:
                 endAttributeOverride();
                 break;
@@ -632,11 +633,11 @@
     private void endAttributeOverride()
         throws SAXException {
         Object elem = currentElement();
-        FieldMapping fm;
+        FieldMapping fm = null;
         if (elem instanceof ClassMapping)
             fm = getAttributeOverride((ClassMapping) elem);
         else
-            fm = getAttributeOverride((FieldMapping) elem);
+            fm = getAttributeOverrideForEmbeddable((FieldMapping) elem);
         if (_cols != null) {
             fm.getValueInfo().setColumns(_cols);
             if (_colTable != null)
@@ -662,7 +663,7 @@
     /**
      * Return the proper override.
      */
-    private FieldMapping getAttributeOverride(FieldMapping fm) 
+    private FieldMapping getAttributeOverrideForEmbeddable(FieldMapping fm) 
     throws SAXException {
         return AnnotationPersistenceMappingParser.getEmbeddedFieldMapping(fm, 
             _override);
@@ -689,10 +690,16 @@
         String table = toTableName(attrs.getValue("schema"),
             attrs.getValue("name"));
         if (table != null) {
-            FieldMapping fm = (FieldMapping) currentElement();
-            if (_override != null) 
-                fm = getAttributeOverride(fm);
-            
+            Object elem = currentElement();
+            FieldMapping fm = null;
+            if (elem instanceof FieldMapping) {
+                fm = (FieldMapping) elem;
+                if (_override != null) 
+                    fm = getAttributeOverrideForEmbeddable(fm);
+            } else if (elem instanceof ClassMapping) {
+                ClassMapping cm = (ClassMapping) elem;
+                fm = getAttributeOverride(cm);
+            }
             fm.getMappingInfo().setTableName(table);
         }
         return true;
@@ -702,9 +709,16 @@
      * Set the join table information back.
      */
     private void endJoinTable() throws SAXException {
-        FieldMapping fm = (FieldMapping) currentElement();
-        if (_override != null)
-            fm = getAttributeOverride(fm);
+        Object elem = currentElement();
+        FieldMapping fm = null;
+        if (elem instanceof FieldMapping) {
+            fm = (FieldMapping) elem;
+            if (_override != null)
+                fm = getAttributeOverrideForEmbeddable(fm);
+        } else if (elem instanceof ClassMapping){
+            ClassMapping cm = (ClassMapping) elem;
+            fm = getAttributeOverride(cm);
+        }
 
         if (_joinCols != null)
             fm.getMappingInfo().setColumns(_joinCols);

Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/AbstractEmployee.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/AbstractEmployee.java?rev=750469&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/AbstractEmployee.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/AbstractEmployee.java Thu Mar  5 14:51:53 2009
@@ -0,0 +1,65 @@
+/*
+ * 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.embed.attrOverrides;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+
+import javax.persistence.Id;
+import javax.persistence.ManyToMany;
+import javax.persistence.ManyToOne;
+import javax.persistence.MappedSuperclass;
+import javax.persistence.Version;
+
+@MappedSuperclass
+public abstract class AbstractEmployee {
+    @Id protected Integer id;
+    
+    @Version protected Integer version;
+    
+    @ManyToOne protected Address address;
+
+    @ManyToMany protected Collection<Project> projects = 
+    	new ArrayList<Project>();
+    
+    public Integer getId() {
+        return id;
+    }
+    
+    public void setId(Integer id) {
+        this.id = id;
+    }
+    
+    public Address getAddress() {
+        return address;
+    }
+    
+    public void setAddress(Address address) {
+        this.address = address;
+    }
+    
+    public Collection<Project> getProjects() {
+    	return projects;
+    }
+    
+    public void addProject(Project project) {
+    	projects.add(project);
+    }
+}

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/Address.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/Address.java?rev=750469&r1=750468&r2=750469&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/Address.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/Address.java Thu Mar  5 14:51:53 2009
@@ -20,8 +20,10 @@
 
 import javax.persistence.*;
 
-@Embeddable 
+@Entity
+@Table(name="ADDR_ATTROVER")
 public class Address {
+    @Id int id;
     @Column(length = 20)
     protected String street;
     @Column(length = 20)
@@ -30,6 +32,14 @@
     protected String state;
     @Embedded protected Zipcode zipcode;
     
+    public int getId() {
+        return id;
+    }
+    
+    public void setId(int id) {
+        this.id = id;
+    }
+    
     public String getStreet() {
         return street;
     }

Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/PartTimeEmployee.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/PartTimeEmployee.java?rev=750469&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/PartTimeEmployee.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/PartTimeEmployee.java Thu Mar  5 14:51:53 2009
@@ -0,0 +1,57 @@
+/*
+ * 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.embed.attrOverrides;
+
+import javax.persistence.AssociationOverride;
+import javax.persistence.AssociationOverrides;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.Table;
+
+@Entity
+@AssociationOverrides({
+	@AssociationOverride(
+		name="address",
+		joinColumns=@JoinColumn(name="ADDR_ID")),
+	
+	@AssociationOverride(
+		name="projects",
+		joinColumns={},
+    	joinTable=@JoinTable(
+       		name="PART_EMP_PROJECTS",
+       		joinColumns=@JoinColumn(name="PART_EMP"),
+       		inverseJoinColumns=@JoinColumn(name="PROJECT_ID")))
+})
+
+@Table(name="PART_EMP_ASSOC")
+public class PartTimeEmployee extends AbstractEmployee {
+
+	@Column(name="WAGE")
+	protected Float wage;
+
+    public Float getHourlyWage() {
+        return wage;
+    }
+    
+    public void setHourlyWage(Float wage) {
+        this.wage = wage;
+    }
+}

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/PhoneNumber.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/PhoneNumber.java?rev=750469&r1=750468&r2=750469&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/PhoneNumber.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/PhoneNumber.java Thu Mar  5 14:51:53 2009
@@ -22,6 +22,7 @@
 import java.util.*;
 
 @Entity
+@Table(name="PHONE_ATTROVER")
 public class PhoneNumber {
     @Id 
     int number;

Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/Project.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/Project.java?rev=750469&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/Project.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/Project.java Thu Mar  5 14:51:53 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.embed.attrOverrides;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name="PROJ_ATTROVER")
+public class Project {
+	@Id int id;
+	String description;
+	
+	public int getId() {
+		return id;
+	}
+	
+	public void setId(int id) {
+		this.id = id;
+	}
+	
+	public String getDescription() {
+		return description;
+	}
+	
+	public void setDescription(String description) {
+		this.description = description;
+	}
+}

Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/TestAssocOverrides.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/TestAssocOverrides.java?rev=750469&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/TestAssocOverrides.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/TestAssocOverrides.java Thu Mar  5 14:51:53 2009
@@ -0,0 +1,279 @@
+/*
+ * 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.embed.attrOverrides;
+
+import java.util.Collection;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityTransaction;
+import javax.persistence.Query;
+
+import junit.framework.Assert;
+
+import org.apache.openjpa.persistence.test.SQLListenerTestCase;
+
+public class TestAssocOverrides  extends SQLListenerTestCase { 
+    public int numEmployees = 2;
+    public int numPhoneNumbers = numEmployees + 1;
+    public int numEmployeesPerPhoneNumber = 2;
+    public int numPhoneNumbersPerEmployee = 2;
+    public int numJobsPerEmployee = 2;
+    public int empId = 1;
+    public int phoneId = 1;
+    public int addrId = 1;
+    public int pmId = 1;
+    public int peId = 1;
+    public int pId = 1;
+
+    public void setUp() throws Exception {
+        super.setUp(DROP_TABLES, Address.class, ContactInfo.class, 
+            EmergencyContactInfo.class, Employee.class, JobInfo.class,
+            PhoneNumber.class, ProgramManager.class, Zipcode.class,
+            AbstractEmployee.class, PartTimeEmployee.class, Project.class);
+    }
+
+    /**
+     * Test AssociationOverrides on field
+     */
+    public void testAssocOverride1() {
+        sql.clear();
+        createObj1();
+        findObj1();
+        queryObj1();
+        assertMappingOverrides("EMPPHONES");
+        assertMappingOverrides("EMP_ATTROVER");
+        assertMappingOverrides("EMP_ATTROVER_jobInfos");
+    }
+
+    /**
+     * Test AssociationOverrides on entity (MappedSuperclass)
+     */
+    public void testAssocOverride2() {
+        sql.clear();
+        createObj2();
+        findObj2();
+        queryObj2();
+        assertMappingOverrides("PART_EMP_ASSOC");
+        assertMappingOverrides("PART_EMP_PROJECTS");
+   }
+    
+	public void createObj1() {
+		EntityManager em = emf.createEntityManager();
+		EntityTransaction tran = em.getTransaction();
+		for (int i = 0; i < numEmployees; i++)
+		    createEmployee(em, empId++);
+		tran.begin();
+		em.flush();
+		tran.commit();
+        em.close();
+	}
+
+    public Employee createEmployee(EntityManager em, int id) {
+        Employee e = new Employee();
+        e.setEmpId(id);
+        ContactInfo contactInfo = new ContactInfo();
+        for (int i = 0; i < numPhoneNumbersPerEmployee; i++) { 
+            PhoneNumber phoneNumber = createPhoneNumber(em);
+            contactInfo.addPhoneNumber(phoneNumber);
+            e.setContactInfo(contactInfo);
+            phoneNumber.addEmployees(e);
+            em.persist(phoneNumber);
+        }
+        Address addr = new Address();
+        addr.setId(addrId++);
+        addr.setCity("city_" + addr.getId());
+        addr.setState("state_" + addr.getId());
+        addr.setStreet("street_" + addr.getId());
+        Zipcode zip = new Zipcode();
+        zip.setZip("zip_" + addr.getId());
+        zip.setPlusFour("+4_" + addr.getId());
+        addr.setZipcode(zip);
+        em.persist(addr);
+        contactInfo.setAddress(addr);
+                
+        EmergencyContactInfo ecInfo = new EmergencyContactInfo();
+        ecInfo.setFName("fName_" + id);
+        ecInfo.setLName("lName_" + id);
+        Address eaddr = new Address();
+        eaddr.setId(addrId++);
+        eaddr.setCity("city_" + eaddr.getId());
+        eaddr.setState("state_" + eaddr.getId());
+        eaddr.setStreet("street_" + eaddr.getId());
+        Zipcode ezip = new Zipcode();
+        ezip.setZip("zip_" + eaddr.getId());
+        ezip.setPlusFour("+4_" + eaddr.getId());
+        eaddr.setZipcode(ezip);
+        ecInfo.setAddress(eaddr);
+        contactInfo.setEmergencyContactInfo(ecInfo);
+        PhoneNumber phoneNumber = createPhoneNumber(em);
+        ecInfo.setPhoneNumber(phoneNumber);
+        em.persist(eaddr);
+        
+        for (int i = 0; i < numJobsPerEmployee; i++) {
+        	JobInfo job = new JobInfo();
+        	job.setJobDescription("job_" + id + "_" + i);
+        	ProgramManager pm = new ProgramManager();
+        	pm.setId(pmId++);
+        	pm.addManage(e);
+        	em.persist(pm);
+        	job.setProgramManager(pm);
+        	e.addJobInfo(job);
+        }
+        em.persist(e);
+        return e;
+    }
+	
+    public PhoneNumber createPhoneNumber(EntityManager em) {
+    	PhoneNumber p = new PhoneNumber();
+    	p.setNumber(phoneId++);
+    	em.persist(p);
+    	return p;
+    }    
+    
+	public void findObj1() {
+        EntityManager em = emf.createEntityManager();
+ 	    Employee e = em.find(Employee.class, 1);
+	    assertEmployee(e);
+	    em.close();
+	}
+	
+	public void queryObj1() {
+	    EntityManager em = emf.createEntityManager();
+	    EntityTransaction tran = em.getTransaction();
+	    tran.begin();
+	    Query q = em.createQuery("select e from Employee e");
+	    List<Employee> es = q.getResultList();
+	    for (Employee e : es){
+	        assertEmployee(e);
+	    }
+	    tran.commit();
+	    em.close();
+	}
+
+    public void assertEmployee(Employee e) {
+        int id = e.getEmpId();
+        ContactInfo c = e.getContactInfo();
+        List<PhoneNumber> phones = c.getPhoneNumbers();
+        for (PhoneNumber p : phones) {
+            assertPhoneNumber(p, e.getEmpId());
+        }
+    }
+	
+    public void assertPhoneNumber(PhoneNumber p, int empId) {
+        int number = p.getNumber();
+        Collection<Employee> es = p.getEmployees();
+        for (Employee e: es) {
+            assertEquals(empId, e.getEmpId());
+        }
+    }
+
+    public void createObj2() {
+        EntityManager em = emf.createEntityManager();
+        EntityTransaction tran = em.getTransaction();
+        for (int i = 0; i < numEmployees; i++)
+            createPartTimeEmployee(em, peId++);
+        tran.begin();
+        em.flush();
+        tran.commit();
+        em.close();
+    }
+
+    public PartTimeEmployee createPartTimeEmployee(EntityManager em, int id) {
+        PartTimeEmployee p = new PartTimeEmployee();
+        p.setId(id);
+        Address addr = new Address();
+        addr.setId(id);
+        addr.setCity("city_" + id);
+        addr.setState("state_" + id);
+        addr.setStreet("street_" + id);
+        p.setAddress(addr);
+        p.setHourlyWage((float)100);
+        Project project = new Project();
+        project.setId(pId++);
+        project.setDescription("p_" + project.getId());
+        p.addProject(project);
+        em.persist(addr);
+        em.persist(p);
+        em.persist(project);
+        return p;
+    }
+
+    public void findObj2() {
+        EntityManager em = emf.createEntityManager();
+        PartTimeEmployee p = em.find(PartTimeEmployee.class, 1);
+        Assert.assertEquals(p.getHourlyWage(), (float)100);
+    }
+
+    public void queryObj2() {
+        EntityManager em = emf.createEntityManager();
+        EntityTransaction tran = em.getTransaction();
+        tran.begin();
+        String firstName = "f_1";
+        String jpql = "select p from PartTimeEmployee p";
+        Query q = em.createQuery(jpql);
+        List<PartTimeEmployee> ps = q.getResultList();
+        Assert.assertEquals(ps.size(), numEmployees);
+        tran.commit();
+        em.close();
+    }
+    
+    public void assertMappingOverrides(String tableName) {
+        boolean found = false;
+        for (String sqlStr : sql) {
+            String key = "CREATE TABLE " + tableName + " ";
+            if (sqlStr.indexOf(key) != -1) {
+                if (tableName.equals("EMPPHONES")) {
+                    if (sqlStr.indexOf("EMP") == -1 ||
+                        sqlStr.indexOf("PHONE") == -1)
+                        fail();
+                    found = true;
+                } else if (tableName.equals("EMP_ATTROVER")) {
+                    if (sqlStr.indexOf("EMP_ADDR") == -1 ||
+                        sqlStr.indexOf("EMERGENCY_FNAME") == -1 ||
+                        sqlStr.indexOf("EMERGENCY_LNAME") == -1 ||
+                        sqlStr.indexOf("EMERGENCY_ADDR") == -1 ||
+                        sqlStr.indexOf("EMERGENCY_PHONE") == -1)
+                        fail();
+                    found = true;
+                } else if (tableName.equals("EMP_ATTROVER_jobInfos")) {
+                    if (sqlStr.indexOf("JOB_KEY") == -1 ||
+                        sqlStr.indexOf("JOB_DESC") == -1 ||
+                        sqlStr.indexOf("PROGRAM_MGR") == -1)
+                        fail();
+                    found = true;
+                } else if (tableName.equals("PART_EMP_ASSOC")) {
+                    if (sqlStr.indexOf("ADDR_ID") == -1)
+                        fail();
+                    found = true;
+                } else if (tableName.equals("PART_EMP_PROJECTS")) {
+                    if (sqlStr.indexOf("PART_EMP") == -1 ||
+                        sqlStr.indexOf("PROJECT_ID") == -1)
+                        fail();
+                    found = true;
+                }
+                break;
+            } 
+        }
+        if (!found) {
+            fail();
+        }
+    }
+
+}
\ No newline at end of file

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/TestAttrOverrides.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/TestAttrOverrides.java?rev=750469&r1=750468&r2=750469&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/TestAttrOverrides.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/TestAttrOverrides.java Thu Mar  5 14:51:53 2009
@@ -41,6 +41,7 @@
 
     /**
      * This is spec 10.1.4 Example 2
+     * Test AttributeOverride on embeddable fields
      */
     public void testAttrOverride1() {
         sql.clear();
@@ -52,13 +53,14 @@
 
     /**
      * This is spec 10.1.4. Example 3
+     * Test AttributeOverrides on embeddable Map field
      */
     public void testAttrOverride2() {
         sql.clear();
         createObj2();
         findObj2();
         queryObj2();
-        assertAttrOverrides("PROPREC_ATTROVER_PARCELS");
+        assertAttrOverrides("PROPREC_ATTROVER_parcels");
     }
     
     public void createObj1() {
@@ -188,21 +190,26 @@
     }
     
     public void assertAttrOverrides(String tableName) {
+        boolean found = false;
         for (String sqlStr : sql) {
-            if (sqlStr.toUpperCase().indexOf("CREATE TABLE " + tableName) != -1) {
+            if (sqlStr.indexOf("CREATE TABLE " + tableName + " ") != -1) {
                 if (tableName.equals("CUS_ATTROVER")) {
+                    found = true;
                     if (sqlStr.indexOf("ADDR_STATE") == -1 ||
                         sqlStr.indexOf("ADDR_ZIP") == -1 ||
                         sqlStr.indexOf("ADDR_PLUSFOUR") == -1 )
                         fail();
-                } else if (tableName.equals("PROPREC_ATTROVER")) {
+                } else if (tableName.equals("PROPREC_ATTROVER_parcels")) {
+                    found = true;
                     if (sqlStr.indexOf("STREET_NAME") == -1 ||
                         sqlStr.indexOf("SQUARE_FEET") == -1 ||
                         sqlStr.indexOf("ASSESSMENT") == -1 )
                         fail();
                 }
+                break;
             }
         }
+        if (!found)
+            fail();
     }
-
 }
\ No newline at end of file

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/TestAttrOverridesXml.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/TestAttrOverridesXml.java?rev=750469&r1=750468&r2=750469&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/TestAttrOverridesXml.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/attrOverrides/TestAttrOverridesXml.java Thu Mar  5 14:51:53 2009
@@ -27,16 +27,16 @@
 
 import junit.framework.Assert;
 
-import org.apache.openjpa.persistence.test.SingleEMFTestCase;
+import org.apache.openjpa.persistence.test.SQLListenerTestCase;
 
-public class TestAttrOverridesXml extends SingleEMFTestCase {
+public class TestAttrOverridesXml extends SQLListenerTestCase {
    
     public int numPersons = 4;
     public List<String> namedQueries = new ArrayList<String>();
     public int eId = 1;
     
     public void setUp() {
-        setUp(CLEAR_TABLES);
+        setUp(DROP_TABLES);
     }
     
     @Override
@@ -45,9 +45,11 @@
     }
     
     public void testAttrOverride1() {
+        sql.clear();
     	createObj1();
     	findObj1();
     	queryObj1();
+        assertAttrOverrides("CustomerXml1");
     }
     
     public void createObj1() {
@@ -95,4 +97,20 @@
         tran.commit();
         em.close();
     }
+
+    public void assertAttrOverrides(String tableName) {
+        boolean found = false;
+        for (String sqlStr : sql) {
+            if (sqlStr.indexOf("CREATE TABLE " + tableName) != -1) {
+                if (tableName.equals("CustomerXml1")) {
+                    found = true;
+                    if (sqlStr.indexOf("ADDR_STATE") == -1 ||
+                        sqlStr.indexOf("ADDR_ZIP") == -1)
+                        fail();
+                } 
+            }
+        }
+        if (!found)
+            fail();
+    }
 }