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 2008/12/24 01:19:07 UTC

svn commit: r729181 - in /openjpa/branches/1.3.x: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/

Author: fancy
Date: Tue Dec 23 16:19:07 2008
New Revision: 729181

URL: http://svn.apache.org/viewvc?rev=729181&view=rev
Log:
OPENJPA-557 Primary key sequences broken with postgres schemas
Commit patch provided by Milosz Tylenda

Added:
    openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/Dog3.java
    openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/Dog4.java
Modified:
    openjpa/branches/1.3.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/PostgresDictionary.java
    openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/Dog1.java
    openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/Dog2.java
    openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/DogTable.java
    openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/DogTable2.java
    openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/DogTable3.java
    openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/DogTable4.java
    openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/TestMultipleSchemaNames.java

Modified: openjpa/branches/1.3.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/PostgresDictionary.java
URL: http://svn.apache.org/viewvc/openjpa/branches/1.3.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/PostgresDictionary.java?rev=729181&r1=729180&r2=729181&view=diff
==============================================================================
--- openjpa/branches/1.3.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/PostgresDictionary.java (original)
+++ openjpa/branches/1.3.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/PostgresDictionary.java Tue Dec 23 16:19:07 2008
@@ -113,9 +113,8 @@
         requiresAliasForSubselect = true;
         allowsAliasInBulkClause = false;
 
-        // {2} is the result of getGeneratedKeySequenceName; the
         // single-quote escape will result in SELECT CURVAL('mysequence')
-        lastGeneratedKeyQuery = "SELECT CURRVAL(''{2}'')";
+        lastGeneratedKeyQuery = "SELECT CURRVAL(''{1}_{0}_seq'')";
         supportsAutoAssign = true;
         autoAssignTypeName = "BIGSERIAL";
         nextSequenceQuery = "SELECT NEXTVAL(''{0}'')";

Modified: openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/Dog1.java
URL: http://svn.apache.org/viewvc/openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/Dog1.java?rev=729181&r1=729180&r2=729181&view=diff
==============================================================================
--- openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/Dog1.java (original)
+++ openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/Dog1.java Tue Dec 23 16:19:07 2008
@@ -21,9 +21,6 @@
 import javax.persistence.*;
 import java.io.*;
 
-/**
- * Extension of Animal class illustrating inheritance.
- */
 @Entity(name = "Dog1")
 @Table(name = "DOGAUTO", schema = "SCHEMA1")
 public class Dog1 implements Serializable

Modified: openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/Dog2.java
URL: http://svn.apache.org/viewvc/openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/Dog2.java?rev=729181&r1=729180&r2=729181&view=diff
==============================================================================
--- openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/Dog2.java (original)
+++ openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/Dog2.java Tue Dec 23 16:19:07 2008
@@ -21,9 +21,6 @@
 import javax.persistence.*;
 import java.io.*;
 
-/**
- * Extension of Animal class illustrating inheritance.
- */
 @Entity(name = "Dog2")
 @Table(name = "DOGAUTO", schema = "SCHEMA2")
 public class Dog2 implements Serializable

Added: openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/Dog3.java
URL: http://svn.apache.org/viewvc/openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/Dog3.java?rev=729181&view=auto
==============================================================================
--- openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/Dog3.java (added)
+++ openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/Dog3.java Tue Dec 23 16:19:07 2008
@@ -0,0 +1,51 @@
+/*
+ * 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.generationtype;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity(name = "Dog3")
+@Table(name = "DOGIDENT", schema = "SCHEMA1")
+public class Dog3 {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private int id;
+
+    private 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;
+    }
+}

Added: openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/Dog4.java
URL: http://svn.apache.org/viewvc/openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/Dog4.java?rev=729181&view=auto
==============================================================================
--- openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/Dog4.java (added)
+++ openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/Dog4.java Tue Dec 23 16:19:07 2008
@@ -0,0 +1,51 @@
+/*
+ * 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.generationtype;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity(name = "Dog4")
+@Table(name = "DOGIDENT4")
+public class Dog4 {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private int id;
+
+    private 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;
+    }
+}

Modified: openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/DogTable.java
URL: http://svn.apache.org/viewvc/openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/DogTable.java?rev=729181&r1=729180&r2=729181&view=diff
==============================================================================
--- openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/DogTable.java (original)
+++ openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/DogTable.java Tue Dec 23 16:19:07 2008
@@ -22,9 +22,6 @@
 import javax.persistence.*;
 import java.io.*;
 
-/**
- * Extension of Animal class illustrating inheritance.
- */
 @Entity(name = "DogTable")
 @Table(name = "DOGTABLES", schema = "SCHEMA1")
 public class DogTable implements Serializable

Modified: openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/DogTable2.java
URL: http://svn.apache.org/viewvc/openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/DogTable2.java?rev=729181&r1=729180&r2=729181&view=diff
==============================================================================
--- openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/DogTable2.java (original)
+++ openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/DogTable2.java Tue Dec 23 16:19:07 2008
@@ -21,9 +21,6 @@
 import java.io.*;
 import javax.persistence.*;
 
-/**
- * Extension of Animal class illustrating inheritance.
- */
 @Entity(name = "DogTable2")
 @Table(name = "DOGTABLES", schema = "SCHEMA2")
 public class DogTable2 implements Serializable

Modified: openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/DogTable3.java
URL: http://svn.apache.org/viewvc/openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/DogTable3.java?rev=729181&r1=729180&r2=729181&view=diff
==============================================================================
--- openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/DogTable3.java (original)
+++ openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/DogTable3.java Tue Dec 23 16:19:07 2008
@@ -21,9 +21,6 @@
 import java.io.*;
 import javax.persistence.*;
 
-/**
- * Extension of Animal class illustrating inheritance.
- */
 @Entity(name = "DogTable3")
 @Table(name = "DOGTABLES", schema = "SCHEMA3")
 public class DogTable3 implements Serializable

Modified: openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/DogTable4.java
URL: http://svn.apache.org/viewvc/openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/DogTable4.java?rev=729181&r1=729180&r2=729181&view=diff
==============================================================================
--- openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/DogTable4.java (original)
+++ openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/DogTable4.java Tue Dec 23 16:19:07 2008
@@ -21,9 +21,6 @@
 import java.io.*;
 import javax.persistence.*;
 
-/**
- * Extension of Animal class illustrating inheritance.
- */
 @Entity(name = "DogTable4")
 @Table(name = "DOGTABLES4")
 public class DogTable4 implements Serializable

Modified: openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/TestMultipleSchemaNames.java
URL: http://svn.apache.org/viewvc/openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/TestMultipleSchemaNames.java?rev=729181&r1=729180&r2=729181&view=diff
==============================================================================
--- openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/TestMultipleSchemaNames.java (original)
+++ openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/TestMultipleSchemaNames.java Tue Dec 23 16:19:07 2008
@@ -19,15 +19,31 @@
 package org.apache.openjpa.persistence.generationtype;
 
 import java.util.List;
+
 import javax.persistence.EntityManager;
+import javax.persistence.PersistenceException;
 import javax.persistence.Query;
-import org.apache.openjpa.persistence.*;
+
+import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
+import org.apache.openjpa.jdbc.sql.DBDictionary;
+import org.apache.openjpa.jdbc.sql.PostgresDictionary;
+import org.apache.openjpa.persistence.OpenJPAEntityManager;
+import org.apache.openjpa.persistence.OpenJPAEntityManagerFactorySPI;
+import org.apache.openjpa.persistence.OpenJPAEntityManagerSPI;
+import org.apache.openjpa.persistence.OpenJPAPersistence;
 import org.apache.openjpa.persistence.test.SingleEMFTestCase;
 
 public class TestMultipleSchemaNames extends SingleEMFTestCase {
+
     public void setUp() {
-        setUp(Dog1.class, Dog2.class, DogTable.class, DogTable2.class,
-                DogTable3.class, DogTable4.class);
+        // Create schemas when database requires this and we are about
+        // to execute the first test.
+        if ("testGeneratedAUTO".equals(getName())) {
+            createSchemas();
+        }
+
+        setUp(Dog1.class, Dog2.class, Dog3.class, Dog4.class,
+            DogTable.class, DogTable2.class, DogTable3.class, DogTable4.class);
 
         EntityManager em = emf.createEntityManager();
         em.getTransaction().begin();
@@ -77,6 +93,22 @@
             em.remove(Obj);
         }
 
+        Query qry7 = em.createQuery("select d from Dog3 d");
+        List result7 = qry7.getResultList();
+
+        for (int index = 0; index < result7.size(); index++) {
+            Dog3 Obj = (Dog3) result7.get(index);
+            em.remove(Obj);
+        }
+
+        Query qry8 = em.createQuery("select d from Dog4 d");
+        List result8 = qry8.getResultList();
+
+        for (int index = 0; index < result8.size(); index++) {
+            Dog4 Obj = (Dog4) result8.get(index);
+            em.remove(Obj);
+        }
+
         Query delschema1 = em
                 .createNativeQuery("delete from schema1.openjpa_sequence_table");
         delschema1.executeUpdate();
@@ -321,4 +353,83 @@
         em.getTransaction().commit();
         em.close();
     }
+    
+    public void testGeneratedIDENTITY() {
+        EntityManager em = emf.createEntityManager();
+        OpenJPAEntityManager kem = OpenJPAPersistence.cast(em);
+
+        // Dog3 is a schema dog.
+        em.getTransaction().begin();
+        Dog3 dog30 = new Dog3();
+        dog30.setName("Dog30");
+        em.persist(dog30);
+        
+        Dog3 dog31 = new Dog3();
+        dog31.setName("Dog31");
+        em.persist(dog31);
+        em.getTransaction().commit();
+
+        // We can't assume generated values start with 1 as
+        // the table might have already existed and had some rows.
+        Dog3 dog30x = em.find(Dog3.class, kem.getObjectId(dog30));
+        Dog3 dog31x = em.find(Dog3.class, kem.getObjectId(dog31));
+        assertTrue((dog30x.getId() + 1 == dog31x.getId()) ||
+            (dog30x.getId() == dog31x.getId() + 1));
+        assertEquals(dog30x.getName(), "Dog30");
+
+        // Dog4 is a non-schema dog.
+        em.getTransaction().begin();
+        Dog4 dog40 = new Dog4();
+        dog40.setName("Dog40");
+        em.persist(dog40);
+        
+        Dog4 dog41 = new Dog4();
+        dog41.setName("Dog41");
+        em.persist(dog41);
+        em.getTransaction().commit();
+
+        Dog4 dog40x = em.find(Dog4.class, kem.getObjectId(dog40));
+        Dog4 dog41x = em.find(Dog4.class, kem.getObjectId(dog41));
+        assertTrue((dog40x.getId() + 1 == dog41x.getId()) ||
+            (dog40x.getId() == dog41x.getId() + 1));
+        assertEquals(dog40x.getName(), "Dog40");
+
+        em.close();
+    }
+    
+    /**
+     * Create necessary schemas if running on PostgreSQL as it does
+     * not create them automatically.
+     * Oracle and MySQL also don't create schemas automatically but
+     * we give up as they treat schemas in special ways.
+     */
+    private void createSchemas() {
+        OpenJPAEntityManagerFactorySPI emf = createEMF();
+        OpenJPAEntityManagerSPI em = emf.createEntityManager();
+        DBDictionary dict = ((JDBCConfiguration) em.getConfiguration())
+            .getDBDictionaryInstance();
+
+        if (!(dict instanceof PostgresDictionary)) {
+            closeEMF(emf);
+            return;
+        }
+        
+        String[] schemas =
+            { "SCHEMA1", "SCHEMA2", "SCHEMA3", "SCHEMA3G", "SCHEMA4G" };
+        for (String schema : schemas) {
+            try {
+                em.getTransaction().begin();
+                Query q = em.createNativeQuery("create schema " + schema);
+                q.executeUpdate();
+                em.getTransaction().commit();
+            } catch (PersistenceException e) {
+                System.err.println("Exception caught while creating schema "
+                    + schema + ". Schema already exists? Message: "
+                    + e.getMessage());
+                em.getTransaction().rollback();
+            }
+        }
+        closeEMF(emf);
+    }
+
 } // end of TestMultipleSchemaNames