[openjpa] branch master updated (d6a19dd -> d6a64be)

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

[openjpa] branch master updated (d6a19dd -> d6a64be)

struberg
This is an automated email from the ASF dual-hosted git repository.

struberg pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/openjpa.git.


    from d6a19dd  Oracle seems to have changed their error handling.
     new bb214f9  fix TestQueryExcludingSubclasses sorting
     new 2408ff7  tests which do not commit are not likely to fail...
     new d6a64be  OPENJPA-2866 Oracle GenerationType#IDENTITY support

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../apache/openjpa/jdbc/sql/OracleDictionary.java  | 40 ++++++++++++++++++++++
 .../openjpa/persistence/TestOpenJPA2330.java       |  3 +-
 .../query/TestQueryExcludingSubclasses.java        | 14 ++++----
 3 files changed, 49 insertions(+), 8 deletions(-)
Reply | Threaded
Open this post in threaded view
|

[openjpa] 01/03: fix TestQueryExcludingSubclasses sorting

struberg
This is an automated email from the ASF dual-hosted git repository.

struberg pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openjpa.git

commit bb214f93d4027c298a38eb679e97f6e8c2ed12d8
Author: Mark Struberg <[hidden email]>
AuthorDate: Sat Apr 10 11:39:57 2021 +0200

    fix TestQueryExcludingSubclasses sorting
   
    The sorting behaviour of characters )'a..z, A..Z') and
    numbers (0..9) is depending on NLS. For e.g. german NLS
    in Oracle 0 comes only after z, so we get esub1,esub2,e1,e2
    while on some other databases we get e1,e2,esub1,esub2.
    Easy fix is to have the second position also a Character to
    force a distinctive order over all different databases and
    settings.
---
 .../persistence/query/TestQueryExcludingSubclasses.java    | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestQueryExcludingSubclasses.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestQueryExcludingSubclasses.java
index afae439..4d3dc13 100644
--- a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestQueryExcludingSubclasses.java
+++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestQueryExcludingSubclasses.java
@@ -41,15 +41,15 @@ public class TestQueryExcludingSubclasses
         setUp(ManyOneEntity.class, ManyOneEntitySub.class);
 
         ManyOneEntity e1 = new ManyOneEntity();
-        e1.setName("e1");
+        e1.setName("eMain1");
         ManyOneEntity e2 = new ManyOneEntity();
-        e2.setName("e2");
+        e2.setName("eMain2");
         ManyOneEntity invalid = new ManyOneEntity();
         invalid.setName("invalid");
         ManyOneEntitySub esub1 = new ManyOneEntitySub();
-        esub1.setName("esub1");
+        esub1.setName("eSub1");
         ManyOneEntitySub esub2 = new ManyOneEntitySub();
-        esub2.setName("esub2");
+        esub2.setName("eSub2");
         ManyOneEntitySub invalidsub = new ManyOneEntitySub();
         invalidsub.setName("invalidsub");
 
@@ -73,11 +73,11 @@ public class TestQueryExcludingSubclasses
         assertEquals(4, res.size());
         for (int i = 0; i < 2; i++) {
             assertEquals(ManyOneEntity.class, res.get(i).getClass());
-            assertEquals("e" + (i + 1), res.get(i).getName());
+            assertEquals("eMain" + (i + 1), res.get(i).getName());
         }
         for (int i = 0; i < 2; i++) {
             assertEquals(ManyOneEntitySub.class, res.get(i + 2).getClass());
-            assertEquals("esub" + (i + 1), res.get(i + 2).getName());
+            assertEquals("eSub" + (i + 1), res.get(i + 2).getName());
         }
         em.close();
     }
@@ -91,7 +91,7 @@ public class TestQueryExcludingSubclasses
         assertEquals(2, res.size());
         for (int i = 0; i < res.size(); i++) {
             assertEquals(ManyOneEntity.class, res.get(i).getClass());
-            assertEquals("e" + (i + 1), res.get(i).getName());
+            assertEquals("eMain" + (i + 1), res.get(i).getName());
         }
         em.close();
     }
Reply | Threaded
Open this post in threaded view
|

[openjpa] 02/03: tests which do not commit are not likely to fail...

struberg
In reply to this post by struberg
This is an automated email from the ASF dual-hosted git repository.

struberg pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openjpa.git

commit 2408ff7d9e4d8f16b29d3d393310680e6d93316f
Author: Mark Struberg <[hidden email]>
AuthorDate: Sat Apr 10 12:27:07 2021 +0200

    tests which do not commit are not likely to fail...
---
 .../src/test/java/org/apache/openjpa/persistence/TestOpenJPA2330.java  | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/TestOpenJPA2330.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/TestOpenJPA2330.java
index 1ed47f4..85e83f5 100644
--- a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/TestOpenJPA2330.java
+++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/TestOpenJPA2330.java
@@ -39,6 +39,7 @@ public class TestOpenJPA2330 extends SingleEMFTestCase {
     public void testOpenJPA2330() {
         final EntityManager em = emf.createEntityManager();
 
+        em.getTransaction().begin();
         EntityA a = new EntityA();
         EntityB b = new EntityB(a);
         // set back pointer
@@ -49,8 +50,8 @@ public class TestOpenJPA2330 extends SingleEMFTestCase {
         b.getCs().add(c);
 
         em.persist(a);
-        em.persist(b);
         em.persist(c);
+        em.getTransaction().commit();
 
         assertEquals(LoadState.LOADED, OpenJPAPersistenceUtil.isLoaded(b, "center"));
 
Reply | Threaded
Open this post in threaded view
|

[openjpa] 03/03: OPENJPA-2866 Oracle GenerationType#IDENTITY support

struberg
In reply to this post by struberg
This is an automated email from the ASF dual-hosted git repository.

struberg pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openjpa.git

commit d6a64bebcd275c1af8e9b9eebeb7ac741321c433
Author: Mark Struberg <[hidden email]>
AuthorDate: Sat Apr 10 12:27:37 2021 +0200

    OPENJPA-2866 Oracle GenerationType#IDENTITY support
   
    we will now create a column definition
    "GENERATED ALWAYS AS IDENTITY"
    for auto-increment columns.
---
 .../apache/openjpa/jdbc/sql/OracleDictionary.java  | 40 ++++++++++++++++++++++
 1 file changed, 40 insertions(+)

diff --git a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/OracleDictionary.java b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/OracleDictionary.java
index b352908..8109937 100644
--- a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/OracleDictionary.java
+++ b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/OracleDictionary.java
@@ -58,6 +58,7 @@ import org.apache.openjpa.jdbc.schema.ForeignKey.FKMapKey;
 import org.apache.openjpa.jdbc.schema.Index;
 import org.apache.openjpa.jdbc.schema.PrimaryKey;
 import org.apache.openjpa.jdbc.schema.Table;
+import org.apache.openjpa.jdbc.schema.Unique;
 import org.apache.openjpa.lib.jdbc.DelegatingDatabaseMetaData;
 import org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement;
 import org.apache.openjpa.lib.util.J2DoPrivHelper;
@@ -180,6 +181,10 @@ public class OracleDictionary
         maxEmbeddedClobSize = 4000;
         inClauseLimit = 1000;
 
+        // support auto increment columns javax.persistence.GenerationType#IDENTITY
+        supportsAutoAssign = true;
+        autoAssignClause = "GENERATED ALWAYS AS IDENTITY";
+
         supportsDeferredConstraints = true;
         supportsLockingWithDistinctClause = false;
         supportsSelectStartIndex = true;
@@ -397,6 +402,41 @@ public class OracleDictionary
             sel.getEndIndex(), sel.isDistinct(), sel.getOrdering());
     }
 
+    /**
+     * Return the declaration SQL for the given column. This method is used
+     * for each column from within {@link #getCreateTableSQL} and
+     * {@link #getAddColumnSQL}.
+     *
+     * Oracle needs a bit special handling for auto assign columns.
+     * For those ("GENERATED ALWAYS AS IDENTITY") we must not generate NOT NULL
+     * as this would create invalid statements for Oracle.
+     */
+    @Override
+    protected String getDeclareColumnSQL(Column col, boolean alter) {
+        StringBuilder buf = new StringBuilder();
+        String columnName = checkNameLength(toDBName(col.getIdentifier()), maxColumnNameLength,
+                "long-column-name");
+        buf.append(columnName).append(" ");
+        buf.append(getTypeName(col));
+
+        // can't add constraints to a column we're adding after table
+        // creation, cause some data might already be inserted
+        if (!alter
+            && !col.isAutoAssigned()) { // this is actually the only 'special' case for oracle
+            if (col.getDefaultString() != null && !col.isAutoAssigned())
+                buf.append(" DEFAULT ").append(col.getDefaultString());
+            if (col.isNotNull() || (!supportsNullUniqueColumn && col.hasConstraint(Unique.class)))
+                buf.append(" NOT NULL");
+        }
+        if (col.isAutoAssigned()) {
+            if (!supportsAutoAssign)
+                log.warn(_loc.get("invalid-autoassign", platform, col));
+            else if (autoAssignClause != null)
+                buf.append(" ").append(autoAssignClause);
+        }
+        return buf.toString();
+    }
+
     @Override
     protected SQLBuffer getSelects(Select sel, boolean distinctIdentifiers,
         boolean forUpdate) {