openjpa-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From fayw...@apache.org
Subject svn commit: r763015 - in /openjpa/trunk: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_27_ex7/ openjpa-persistence-jdbc/src/test/java/spec_10_1_27_ex6/
Date Tue, 07 Apr 2009 22:32:36 GMT
Author: faywang
Date: Tue Apr  7 22:32:36 2009
New Revision: 763015

URL: http://svn.apache.org/viewvc?rev=763015&view=rev
Log:
OPENJPA-1021: support MapKey annotation on relation fields

Added:
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_27_ex7/
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_27_ex7/Company.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_27_ex7/Division.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_27_ex7/TestSpec10_1_27_Ex7.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_27_ex7/VicePresident.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/spec_10_1_27_ex6/
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/spec_10_1_27_ex6/Company.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/spec_10_1_27_ex6/Division.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/spec_10_1_27_ex6/TestSpec10_1_27_Ex6.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/spec_10_1_27_ex6/VicePresident.java
Modified:
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingRepository.java

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingRepository.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingRepository.java?rev=763015&r1=763014&r2=763015&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingRepository.java
(original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingRepository.java
Tue Apr  7 22:32:36 2009
@@ -880,7 +880,7 @@
                 boolean vrel = vhandler == null 
                     && val.getTypeCode() == JavaTypes.PC
                     && !val.isSerialized() && !val.isEmbeddedPC();
-                if (!krel && vrel && key.getValueMappedBy() != null) {
+                if (vrel && key.getValueMappedBy() != null) {
                     if (useInverseKeyMapping(field))
                         return new RelationMapInverseKeyFieldStrategy();
                     return new RelationMapTableFieldStrategy();

Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_27_ex7/Company.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_27_ex7/Company.java?rev=763015&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_27_ex7/Company.java
(added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_27_ex7/Company.java
Tue Apr  7 22:32:36 2009
@@ -0,0 +1,61 @@
+/*
+ * 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.jdbc.maps.spec_10_1_27_ex7;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.persistence.*;
+
+@Entity
+@Table(name="S27x7Comp")
+public class Company {
+    @Id
+    int id;
+
+    @OneToMany(mappedBy="co")
+    @MapKey(name="div")
+    Map<Division, VicePresident> orgs =
+        new HashMap<Division, VicePresident>();
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public Map getOrganization() {
+        return orgs;
+    }
+
+    public void addToOrganization(VicePresident vp) {
+        orgs.put(vp.getDivision(), vp);
+    }
+
+    public void removeFromOrganization(Division d) {
+        orgs.remove(d);
+    }
+
+    public VicePresident getOrganization(Division d) {
+        return orgs.get(d);
+    }
+}
+

Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_27_ex7/Division.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_27_ex7/Division.java?rev=763015&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_27_ex7/Division.java
(added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_27_ex7/Division.java
Tue Apr  7 22:32:36 2009
@@ -0,0 +1,63 @@
+/*
+ * 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.jdbc.maps.spec_10_1_27_ex7;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name="S27x7Div")
+public class Division {
+    @Id
+    int id;
+
+    String name;
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public boolean equals(Object o) {
+        Division d = (Division) o;
+        if (d.name.equals(name) &&
+            d.getId() == id)
+            return true;
+        return false;
+    }
+
+    public int hashCode() {
+        int ret = 0;
+        ret = ret * 31 + name.hashCode();
+        ret = ret *31 + id;
+        return ret;
+    }
+}

Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_27_ex7/TestSpec10_1_27_Ex7.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_27_ex7/TestSpec10_1_27_Ex7.java?rev=763015&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_27_ex7/TestSpec10_1_27_Ex7.java
(added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_27_ex7/TestSpec10_1_27_Ex7.java
Tue Apr  7 22:32:36 2009
@@ -0,0 +1,337 @@
+/*
+ * 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.jdbc.maps.spec_10_1_27_ex7;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.EntityTransaction;
+import javax.persistence.Query;
+
+import junit.framework.Assert;
+
+import org.apache.openjpa.kernel.QueryImpl;
+import org.apache.openjpa.persistence.test.AllowFailure;
+import org.apache.openjpa.persistence.test.SQLListenerTestCase;
+
+public class TestSpec10_1_27_Ex7 extends SQLListenerTestCase {
+    public int numCompany = 2;
+    public int numDivisionsPerCo = 2;
+    public List<String> namedQueries = new ArrayList<String>();
+    
+    public int compId = 1;
+    public int divId = 1;
+    public int vpId = 1;
+    public int newDivId = 100;
+    public int newVpId = 100;
+    public List rsAllCompany = null;
+
+    public void setUp() {
+        super.setUp(CLEAR_TABLES,
+            Company.class,
+            Division.class,
+            VicePresident.class);
+        createObj(emf);
+        rsAllCompany = getAll(Company.class);
+    }
+
+    public void testQueryObj() throws Exception {
+        queryObj(emf);
+    }
+
+    @AllowFailure
+    public void testQueryInMemoryQualifiedId() throws Exception {
+        queryQualifiedId(true);
+    }
+    
+    public void testQueryQualifiedId() throws Exception {
+        queryQualifiedId(false);
+    }
+
+    public void setCandidate(Query q, Class clz) 
+        throws Exception {
+        org.apache.openjpa.persistence.QueryImpl q1 = 
+            (org.apache.openjpa.persistence.QueryImpl) q;
+        org.apache.openjpa.kernel.Query q2 = q1.getDelegate();
+        org.apache.openjpa.kernel.QueryImpl qi = (QueryImpl) q2;
+        if (clz == Company.class)
+            qi.setCandidateCollection(rsAllCompany);
+    }
+
+    public void queryQualifiedId(boolean inMemory) throws Exception {
+        EntityManager em = emf.createEntityManager();
+
+        String query = "select KEY(e) from Company c, " +
+            " in (c.orgs) e order by c.id";
+        Query q = em.createQuery(query);
+        if (inMemory) 
+            setCandidate(q, Company.class);
+        List rs = q.getResultList();
+        Division d = (Division) rs.get(0);
+
+        em.clear();
+        query = "select ENTRY(e) from Company c, " +
+            " in (c.orgs) e order by c.id";
+        q = em.createQuery(query);
+        if (inMemory) 
+            setCandidate(q, Company.class);
+        rs = q.getResultList();
+        Map.Entry me = (Map.Entry) rs.get(0);
+
+        assertTrue(d.equals(me.getKey()));
+
+        em.clear();
+        query = "select KEY(e) from Company c " +
+            " left join c.orgs e order by c.id";
+        q = em.createQuery(query);
+        if (inMemory) 
+            setCandidate(q, Company.class);
+        rs = q.getResultList();
+        d = (Division) rs.get(0);
+
+        em.clear();
+        query = "select ENTRY(e) from Company c " +
+            " left join c.orgs e order by c.id";
+        q = em.createQuery(query);
+        if (inMemory) 
+            setCandidate(q, Company.class);
+        rs = q.getResultList();
+        me = (Map.Entry) rs.get(0);
+        assertTrue(d.equals(me.getKey()));
+
+        em.close();
+    }
+    
+	public void createObj(EntityManagerFactory emf) {
+		EntityManager em = emf.createEntityManager();
+		EntityTransaction tran = em.getTransaction();
+		for (int i = 0; i < numCompany; i++)
+		    createCompany(em, compId++);
+		tran.begin();
+		em.flush();
+		tran.commit();
+        em.close();
+	}
+
+	public void createCompany(EntityManager em, int id) {
+        Company c = new Company();
+        c.setId(id);
+        for (int i = 0; i < numDivisionsPerCo; i++) {
+            Division d = createDivision(em, divId++);
+            VicePresident vp = createVicePresident(em, vpId++, d);
+            c.addToOrganization(vp);
+            vp.setCompany(c);
+            em.persist(d);
+            em.persist(vp);
+        }
+        em.persist(c);
+ 	}
+	
+    public Division createDivision(EntityManager em, int id) {
+        Division d = new Division();
+        d.setId(id);
+        d.setName("d" + id);
+        return d;
+    }
+	
+    public VicePresident createVicePresident(EntityManager em, int id,
+    	Division d) {
+        VicePresident vp = new VicePresident();
+        vp.setId(id);
+        vp.setDivision(d);
+        vp.setName("vp" + id);
+        return vp;
+    }
+	
+	public void findObj(EntityManagerFactory emf) {
+        EntityManager em = emf.createEntityManager();
+ 	    Company c = em.find(Company.class, 1);
+	    assertCompany(c);
+	    
+        Division d = em.find(Division.class, 1);
+        assertDivision(d);
+        
+        VicePresident vp = em.find(VicePresident.class, 1);
+        assertVicePresident(vp);
+        
+        updateObj1(em, c);
+        
+/*        
+        updateObj(em, c);
+        em.close();
+        
+        em = emf.createEntityManager();
+        c = em.find(Company.class, 1);
+        assertCompany(c);
+        deleteObj(em, c);
+	    em.close();
+*/	    
+	}
+
+    public void updateObj1(EntityManager em, Company c) {
+        EntityTransaction tran = em.getTransaction();
+        // remove an element
+        tran.begin();
+        Map orgs = c.getOrganization();
+        VicePresident vp = null;
+        Set keys = orgs.keySet();
+        for (Object key : keys) {
+            Division d = (Division)key;
+            vp = c.getOrganization(d);
+            vp.setCompany(null);
+            em.persist(vp);
+            c.removeFromOrganization(d);
+            break;
+        }
+        em.persist(c);
+        em.flush();
+        tran.commit();
+        
+        tran.begin();
+        em.remove(c);
+        em.flush();
+        tran.commit();
+        
+        tran.begin();
+        Company c1 = new Company();
+        c1.setId(1);
+        Division d = createDivision(em, divId++);
+        c1.addToOrganization(vp);
+        vp.setCompany(c1);
+        em.persist(d);
+        em.persist(c1);
+        em.flush();
+        tran.commit();
+    }
+    
+    public void updateObj(EntityManager em, Company c) {
+        EntityTransaction tran = em.getTransaction();
+        // remove an element
+        tran.begin();
+        Map orgs = c.getOrganization();
+        Set keys = orgs.keySet();
+        for (Object key : keys) {
+            Division d = (Division)key;
+            VicePresident vp = c.getOrganization(d);
+            vp.setCompany(null);
+            em.persist(vp);
+            c.removeFromOrganization(d);
+            break;
+        }
+        em.persist(c);
+        em.flush();
+        tran.commit();
+        
+        // add an element
+        tran.begin();
+        Division d = createDivision(em, newDivId++);
+        VicePresident vp = createVicePresident(em, newVpId++, d);
+        c.addToOrganization(vp);
+        vp.setCompany(c);
+        em.persist(d);
+        em.persist(vp);
+        em.persist(c);
+        em.flush();
+        tran.commit();
+        
+        // modify an element
+        tran.begin();
+        vp = c.getOrganization(d);
+        vp.setName("newAgain");
+        em.persist(vp);
+        em.persist(c);
+        em.flush();
+        tran.commit();
+        
+    }   
+
+    public void deleteObj(EntityManager em, Company c) {
+        EntityTransaction tran = em.getTransaction();
+        tran.begin();
+        em.remove(c);
+        tran.commit();
+    }
+    
+	public void assertCompany(Company c) {
+        int id = c.getId();
+        Map organization = c.getOrganization();
+        Assert.assertEquals(2,organization.size());
+	}
+	
+    public void assertDivision(Division d) {
+        int id = d.getId();
+        String name = d.getName();
+    }
+
+    public void assertVicePresident(VicePresident vp) {
+        int id = vp.getId();
+        String name = vp.getName();
+    }
+	
+	
+	public void queryObj(EntityManagerFactory emf) {
+        queryCompany(emf);
+        queryDivision(emf);
+        queryVicePresident(emf);
+	}
+	
+	public void queryCompany(EntityManagerFactory emf) {
+		EntityManager em = emf.createEntityManager();
+		EntityTransaction tran = em.getTransaction();
+		tran.begin();
+		Query q = em.createQuery("select c from Company c");
+		List<Company> cs = q.getResultList();
+		for (Company c : cs){
+		    assertCompany(c);
+		}
+		tran.commit();
+		em.close();
+	}
+
+	public void queryDivision(EntityManagerFactory emf) {
+	    EntityManager em = emf.createEntityManager();
+	    EntityTransaction tran = em.getTransaction();
+	    tran.begin();
+	    Query q = em.createQuery("select d from Division d");
+	    List<Division> ds = q.getResultList();
+	    for (Division d : ds){
+	        assertDivision(d);
+	    }
+	    tran.commit();
+	    em.close();
+	}
+
+    public void queryVicePresident(EntityManagerFactory emf) {
+        EntityManager em = emf.createEntityManager();
+        EntityTransaction tran = em.getTransaction();
+        tran.begin();
+        Query q = em.createQuery("select vp from VicePresident vp");
+        List<VicePresident> vps = q.getResultList();
+        for (VicePresident vp : vps){
+            assertVicePresident(vp);
+        }
+        tran.commit();
+        em.close();
+    }
+}
+

Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_27_ex7/VicePresident.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_27_ex7/VicePresident.java?rev=763015&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_27_ex7/VicePresident.java
(added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_27_ex7/VicePresident.java
Tue Apr  7 22:32:36 2009
@@ -0,0 +1,68 @@
+/*
+ * 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.jdbc.maps.spec_10_1_27_ex7;
+
+import javax.persistence.*;
+
+@Entity
+@Table(name="S27x7VP")
+public class VicePresident {
+    @Id
+    int id;
+
+    String name;
+
+    @ManyToOne
+    Company co;
+    
+    @OneToOne
+    Division div;
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Company getCompany() {
+        return co;
+    }
+
+    public void setCompany(Company co) {
+        this.co = co;
+    }
+
+    public Division getDivision() {
+        return div;
+    }
+
+    public void setDivision(Division div) {
+        this.div = div;
+    }
+}

Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/spec_10_1_27_ex6/Company.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/spec_10_1_27_ex6/Company.java?rev=763015&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/spec_10_1_27_ex6/Company.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/spec_10_1_27_ex6/Company.java Tue
Apr  7 22:32:36 2009
@@ -0,0 +1,60 @@
+/*
+ * 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.jdbc.maps.spec_10_1_27_ex6;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.persistence.*;
+
+@Entity
+@Table(name="S27x6Comp")
+public class Company {
+    @Id
+    int id;
+
+    @OneToMany
+    @MapKey(name="div")
+    Map<Division, VicePresident> organization =
+        new HashMap<Division, VicePresident>();
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public Map getOrganization() {
+        return organization;
+    }
+
+    public void addToOrganization(VicePresident vp) {
+        organization.put(vp.getDivision(), vp);
+    }
+
+    public void removeFromOrganization(Division d) {
+        organization.remove(d);
+    }
+
+    public VicePresident getOrganization(Division d) {
+        return organization.get(d);
+    }
+}

Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/spec_10_1_27_ex6/Division.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/spec_10_1_27_ex6/Division.java?rev=763015&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/spec_10_1_27_ex6/Division.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/spec_10_1_27_ex6/Division.java Tue
Apr  7 22:32:36 2009
@@ -0,0 +1,63 @@
+/*
+ * 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.jdbc.maps.spec_10_1_27_ex6;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name="S27x6Div")
+public class Division {
+    @Id
+    int id;
+
+    String name;
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public boolean equals(Object o) {
+        Division d = (Division) o;
+        if (d.name.equals(name) &&
+            d.getId() == id)
+            return true;
+        return false;
+    }
+
+    public int hashCode() {
+        int ret = 0;
+        ret = ret * 31 + name.hashCode();
+        ret = ret *31 + id;
+        return ret;
+    }
+}

Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/spec_10_1_27_ex6/TestSpec10_1_27_Ex6.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/spec_10_1_27_ex6/TestSpec10_1_27_Ex6.java?rev=763015&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/spec_10_1_27_ex6/TestSpec10_1_27_Ex6.java
(added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/spec_10_1_27_ex6/TestSpec10_1_27_Ex6.java
Tue Apr  7 22:32:36 2009
@@ -0,0 +1,292 @@
+/*
+ * 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.jdbc.maps.spec_10_1_27_ex6;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.EntityTransaction;
+import javax.persistence.Query;
+
+import junit.framework.Assert;
+
+import org.apache.openjpa.kernel.QueryImpl;
+import org.apache.openjpa.persistence.test.AllowFailure;
+import org.apache.openjpa.persistence.test.SQLListenerTestCase;
+
+public class TestSpec10_1_27_Ex6 extends SQLListenerTestCase {
+    public int numCompany = 2;
+    public int numDivisionsPerCo = 2;
+
+    public int compId = 1;
+    public int divId = 1;
+    public int vpId = 1;
+    public int newDivId = 100;
+    public int newVpId = 100;
+    public List rsAllCompany = null;
+
+    public void setUp() {
+        super.setUp(CLEAR_TABLES,
+            Company.class,
+            Division.class,
+            VicePresident.class);
+        createObj(emf);
+        rsAllCompany = getAll(Company.class);
+    }
+
+    public void testQueryObj() throws Exception {
+        queryObj(emf);
+    }
+
+    @AllowFailure
+    public void testQueryInMemoryQualifiedId() throws Exception {
+        queryQualifiedId(true);
+    }
+    
+    public void testQueryQualifiedId() throws Exception {
+        queryQualifiedId(false);
+    }
+
+    public void setCandidate(Query q, Class clz) 
+        throws Exception {
+        org.apache.openjpa.persistence.QueryImpl q1 = 
+            (org.apache.openjpa.persistence.QueryImpl) q;
+        org.apache.openjpa.kernel.Query q2 = q1.getDelegate();
+        org.apache.openjpa.kernel.QueryImpl qi = (QueryImpl) q2;
+        if (clz == Company.class)
+            qi.setCandidateCollection(rsAllCompany);
+    }
+
+    public void queryQualifiedId(boolean inMemory) throws Exception {
+        EntityManager em = emf.createEntityManager();
+
+        String query = "select KEY(e) from Company c, " +
+            " in (c.organization) e order by c.id";
+        Query q = em.createQuery(query);
+        if (inMemory) 
+            setCandidate(q, Company.class);
+        List rs = q.getResultList();
+        Division d = (Division) rs.get(0);
+
+        em.clear();
+        query = "select ENTRY(e) from Company c, " +
+            " in (c.organization) e order by c.id";
+        q = em.createQuery(query);
+        if (inMemory) 
+            setCandidate(q, Company.class);
+        rs = q.getResultList();
+        Map.Entry me = (Map.Entry) rs.get(0);
+        assertTrue(d.equals(me.getKey()));
+
+        em.clear();
+        query = "select KEY(e) from Company c " +
+            " left join c.organization e order by c.id";
+        q = em.createQuery(query);
+        if (inMemory) 
+            setCandidate(q, Company.class);
+        rs = q.getResultList();
+        d = (Division) rs.get(0);
+
+        em.clear();
+        query = "select ENTRY(e) from Company c " +
+            " left join c.organization e order by c.id";
+        q = em.createQuery(query);
+        if (inMemory) 
+            setCandidate(q, Company.class);
+        rs = q.getResultList();
+        me = (Map.Entry) rs.get(0);
+        assertTrue(d.equals(me.getKey()));
+
+        em.close();
+    }
+
+    public void createObj(EntityManagerFactory emf) {
+        EntityManager em = emf.createEntityManager();
+        EntityTransaction tran = em.getTransaction();
+        for (int i = 0; i < numCompany; i++)
+            createCompany(em, compId++);
+        tran.begin();
+        em.flush();
+        tran.commit();
+        em.close();
+    }
+
+    public void createCompany(EntityManager em, int id) {
+        Company c = new Company();
+        c.setId(id);
+        for (int i = 0; i < numDivisionsPerCo; i++) {
+            Division d = createDivision(em, divId++);
+            VicePresident vp = createVicePresident(em, vpId++, d);
+            c.addToOrganization(vp);
+            em.persist(d);
+            em.persist(vp);
+        }
+        em.persist(c);
+    }
+
+    public Division createDivision(EntityManager em, int id) {
+        Division d = new Division();
+        d.setId(id);
+        d.setName("d" + id);
+        return d;
+    }
+
+    public VicePresident createVicePresident(EntityManager em, int id,
+    	Division div) {
+        VicePresident vp = new VicePresident();
+        vp.setId(id);
+        vp.setDivision(div);
+        vp.setName("vp" + id);
+        return vp;
+    }
+
+    public void findObj(EntityManagerFactory emf) {
+        EntityManager em = emf.createEntityManager();
+        Company c = em.find(Company.class, 1);
+        assertCompany(c);
+
+        Division d = em.find(Division.class, 1);
+        assertDivision(d);
+
+        VicePresident vp = em.find(VicePresident.class, 1);
+        assertVicePresident(vp);
+
+        updateObj(em, c);
+        em.close();
+
+        em = emf.createEntityManager();
+        c = em.find(Company.class, 1);
+        assertCompany(c);
+        deleteObj(em, c);
+        em.close();
+    }
+
+    public void updateObj(EntityManager em, Company c) {
+        EntityTransaction tran = em.getTransaction();
+        // remove an element
+        tran.begin();
+        Map orgs = c.getOrganization();
+        Set keys = orgs.keySet();
+        for (Object key : keys) {
+            Division d = (Division)key;
+            VicePresident vp = c.getOrganization(d);
+            vp.setCompany(null);
+            em.persist(vp);
+            orgs.remove(d);
+            break;
+        }
+        em.persist(c);
+        em.flush();
+        tran.commit();
+
+        // add an element
+        tran.begin();
+        Division d = createDivision(em, newDivId++);
+        VicePresident vp = createVicePresident(em, newVpId++, d);
+        c.addToOrganization(vp);
+        vp.setCompany(c);
+        em.persist(d);
+        em.persist(vp);
+        em.persist(c);
+        em.flush();
+        tran.commit();
+
+        // modify an element
+        tran.begin();
+        vp = c.getOrganization(d);
+        vp.setName("newAgain");
+        em.persist(vp);
+        em.persist(c);
+        em.flush();
+        tran.commit();
+
+    }	
+
+    public void deleteObj(EntityManager em, Company c) {
+        EntityTransaction tran = em.getTransaction();
+        tran.begin();
+        em.remove(c);
+        tran.commit();
+    }
+
+    public void assertCompany(Company c) {
+        int id = c.getId();
+        Map organization = c.getOrganization();
+        Assert.assertEquals(2,organization.size());
+    }
+
+    public void assertDivision(Division d) {
+        int id = d.getId();
+        String name = d.getName();
+    }
+
+    public void assertVicePresident(VicePresident vp) {
+        int id = vp.getId();
+        String name = vp.getName();
+    }
+
+
+    public void queryObj(EntityManagerFactory emf) {
+        queryCompany(emf);
+        queryDivision(emf);
+        queryVicePresident(emf);
+    }
+
+    public void queryCompany(EntityManagerFactory emf) {
+        EntityManager em = emf.createEntityManager();
+        EntityTransaction tran = em.getTransaction();
+        tran.begin();
+        Query q = em.createQuery("select c from Company c");
+        List<Company> cs = q.getResultList();
+        for (Company c : cs){
+            assertCompany(c);
+        }
+        tran.commit();
+        em.close();
+    }
+
+    public void queryDivision(EntityManagerFactory emf) {
+        EntityManager em = emf.createEntityManager();
+        EntityTransaction tran = em.getTransaction();
+        tran.begin();
+        Query q = em.createQuery("select d from Division d");
+        List<Division> ds = q.getResultList();
+        for (Division d : ds){
+            assertDivision(d);
+        }
+        tran.commit();
+        em.close();
+    }
+
+    public void queryVicePresident(EntityManagerFactory emf) {
+        EntityManager em = emf.createEntityManager();
+        EntityTransaction tran = em.getTransaction();
+        tran.begin();
+        Query q = em.createQuery("select vp from VicePresident vp");
+        List<VicePresident> vps = q.getResultList();
+        for (VicePresident vp : vps){
+            assertVicePresident(vp);
+        }
+        tran.commit();
+        em.close();
+    }
+}

Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/spec_10_1_27_ex6/VicePresident.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/spec_10_1_27_ex6/VicePresident.java?rev=763015&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/spec_10_1_27_ex6/VicePresident.java
(added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/spec_10_1_27_ex6/VicePresident.java
Tue Apr  7 22:32:36 2009
@@ -0,0 +1,68 @@
+/*
+ * 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.jdbc.maps.spec_10_1_27_ex6;
+
+import javax.persistence.*;
+
+@Entity
+@Table(name="S27x6VP")
+public class VicePresident {
+    @Id
+    int id;
+
+    String name;
+
+    @ManyToOne
+    Company co;
+    
+    @OneToOne
+    Division div;
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Company getCompany() {
+        return co;
+    }
+
+    public void setCompany(Company co) {
+        this.co = co;
+    }
+
+    public Division getDivision() {
+        return div;
+    }
+
+    public void setDivision(Division div) {
+        this.div = div;
+    }
+}



Mime
View raw message