org.eclipse.persistence.jpa.jse.test test fixes against Oracle DB (#1370)
JPA JSE Tests against Oracle DB fixes
Signed-off-by: Radek Felcman <radek.felcman@oracle.com>
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/DatasourcePlatform.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/DatasourcePlatform.java
index fbf23b9..6b114d1 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/DatasourcePlatform.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/DatasourcePlatform.java
@@ -1065,7 +1065,7 @@
* Override this method if the platform needs to use a custom function based on the DatabaseField
* @return An expression for the given field set equal to a parameter matching the field
*/
- public Expression createExpressionFor(DatabaseField field, Expression builder) {
+ public Expression createExpressionFor(DatabaseField field, Expression builder, String fieldClassificationClassName) {
Expression subExp1 = builder.getField(field);
Expression subExp2 = builder.getParameter(field);
return subExp1.equal(subExp2);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/descriptors/ObjectBuilder.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/descriptors/ObjectBuilder.java
index 66e635c..fb8ec32 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/descriptors/ObjectBuilder.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/descriptors/ObjectBuilder.java
@@ -3035,7 +3035,11 @@
if(null != primaryKeyFields) {
for (int index = 0; index < primaryKeyFields.size(); index++) {
DatabaseField primaryKeyField = primaryKeyFields.get(index);
- subExpression = ((DatasourcePlatform)session.getDatasourcePlatform()).createExpressionFor(primaryKeyField, builder);
+ String fieldClassificationClassName = null;
+ if (this.getBaseMappingForField(primaryKeyField) instanceof AbstractDirectMapping) {
+ fieldClassificationClassName = ((AbstractDirectMapping)this.getBaseMappingForField(primaryKeyField)).getFieldClassificationClassName();
+ }
+ subExpression = ((DatasourcePlatform)session.getDatasourcePlatform()).createExpressionFor(primaryKeyField, builder, fieldClassificationClassName);
if (expression == null) {
expression = subExpression;
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/foundation/AbstractDirectMapping.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/foundation/AbstractDirectMapping.java
index 6fe1d42..d3247c4 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/foundation/AbstractDirectMapping.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/foundation/AbstractDirectMapping.java
@@ -1361,4 +1361,12 @@
databaseRow.add(getField(), null);
}
}
+
+ /**
+ * INTERNAL:
+ * Get fieldClassificationClassName. Value usually exist for fields with some kind of embedded converter like <code>@Lob</code> or <code>@Temporal</code>.
+ */
+ public String getFieldClassificationClassName() {
+ return this.fieldClassificationClassName;
+ }
}
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/OraclePlatform.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/OraclePlatform.java
index 73c55fc..75a2c99 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/OraclePlatform.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/OraclePlatform.java
@@ -1206,15 +1206,17 @@
}
@Override
- public Expression createExpressionFor(DatabaseField field, Expression builder) {
+ public Expression createExpressionFor(DatabaseField field, Expression builder, String fieldClassificationClassName) {
if (field.getType() == java.sql.Clob.class ||
- field.getType() == java.sql.Blob.class) {
+ field.getType() == java.sql.Blob.class ||
+ "java.sql.Clob".equals(fieldClassificationClassName) ||
+ "java.sql.Blob".equals(fieldClassificationClassName)) {
Expression subExp1 = builder.getField(field);
Expression subExp2 = builder.getParameter(field);
subExp1 = subExp1.getFunction("dbms_lob.compare", subExp2);
return subExp1.equal(0);
}
- return super.createExpressionFor(field, builder);
+ return super.createExpressionFor(field, builder, fieldClassificationClassName);
}
// Value of shouldCheckResultTableExistsQuery must be true.
diff --git a/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/embeddable/model/ElementCollectionEmbeddableTemporal.java b/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/embeddable/model/ElementCollectionEmbeddableTemporal.java
index bd7891b..189c5ae 100644
--- a/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/embeddable/model/ElementCollectionEmbeddableTemporal.java
+++ b/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/embeddable/model/ElementCollectionEmbeddableTemporal.java
@@ -13,6 +13,7 @@
import java.util.Date;
+import jakarta.persistence.Column;
import jakarta.persistence.Embeddable;
import jakarta.persistence.Temporal;
import jakarta.persistence.TemporalType;
@@ -21,6 +22,7 @@
public class ElementCollectionEmbeddableTemporal {
@Temporal(value = TemporalType.DATE)
+ @Column(name = "TEMPORALVALUE", columnDefinition = "DATE")
private Date temporalValue;
public ElementCollectionEmbeddableTemporal() { }
diff --git a/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/lob/TestLobMerge.java b/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/lob/TestLobMerge.java
index cdcbd65..2145124 100644
--- a/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/lob/TestLobMerge.java
+++ b/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/lob/TestLobMerge.java
@@ -41,11 +41,6 @@
@Emf(createTables = DDLGen.DROP_CREATE, classes = { CollectedEntity.class, ParentEntity.class })
private EntityManagerFactory emf;
- /**
- * Merging ElementCollections on Oracle fails when EclipseLink generates
- * a DELETE SQL statement with a WHERE clause containing a CLOB.
- *
- */
@Test
public void testLobMerge() throws Exception {
//Test for Oracle only
diff --git a/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/mapping/TestMultitenantOneToMany.java b/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/mapping/TestMultitenantOneToMany.java
index 163062d..6131f5d 100644
--- a/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/mapping/TestMultitenantOneToMany.java
+++ b/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/mapping/TestMultitenantOneToMany.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
@@ -15,6 +15,7 @@
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import org.eclipse.persistence.config.PersistenceUnitProperties;
+import org.eclipse.persistence.internal.jpa.EntityManagerImpl;
import org.eclipse.persistence.jpa.test.framework.DDLGen;
import org.eclipse.persistence.jpa.test.framework.Emf;
import org.eclipse.persistence.jpa.test.framework.EmfRunner;
@@ -51,67 +52,77 @@
)
private EntityManagerFactory emf;
+ private boolean supportedPlatform = false;
+
@Before
public void setup() {
EntityManager em = emf.createEntityManager();
- try {
- em.getTransaction().begin();
- em.createNativeQuery("CREATE SCHEMA tenant_1").executeUpdate();
- em.createNativeQuery("CREATE SCHEMA tenant_2").executeUpdate();
- em.createNativeQuery("CREATE TABLE tenant_1.parent(id bigint primary key)").executeUpdate();
- em.createNativeQuery("CREATE TABLE tenant_2.parent(id bigint primary key)").executeUpdate();
- em.createNativeQuery("CREATE TABLE tenant_1.children(id bigint NOT NULL, parent_id bigint, PRIMARY KEY " +
- "(id), CONSTRAINT parent_fkey FOREIGN KEY (parent_id) REFERENCES tenant_1.parent (id))")
- .executeUpdate();
- em.createNativeQuery("CREATE TABLE tenant_2.children(id bigint NOT NULL, parent_id bigint, PRIMARY KEY " +
- "(id), CONSTRAINT parent_fkey FOREIGN KEY (parent_id) REFERENCES tenant_2.parent (id))")
- .executeUpdate();
- em.createNativeQuery("INSERT INTO tenant_1.parent(id) VALUES(1)").executeUpdate();
- em.createNativeQuery("INSERT INTO tenant_2.parent(id) VALUES(2)").executeUpdate();
- em.createNativeQuery("INSERT INTO tenant_1.children(id, parent_id) VALUES(10, 1)").executeUpdate();
- em.createNativeQuery("INSERT INTO tenant_2.children(id, parent_id) VALUES(11, 2)").executeUpdate();
- em.getTransaction().commit();
- } finally {
- if (em.getTransaction().isActive()) {
- em.getTransaction().rollback();
- }
- if (em.isOpen()) {
- em.close();
+ //MySQL only due permissions for CREATE SCHEMA command.
+ if (((EntityManagerImpl)em).getDatabaseSession().getPlatform().isMySQL()) {
+ supportedPlatform = true;
+ try {
+ em.getTransaction().begin();
+ em.createNativeQuery("DROP SCHEMA IF EXISTS tenant_1").executeUpdate();
+ em.createNativeQuery("DROP SCHEMA IF EXISTS tenant_2").executeUpdate();
+ em.createNativeQuery("CREATE SCHEMA tenant_1").executeUpdate();
+ em.createNativeQuery("CREATE SCHEMA tenant_2").executeUpdate();
+ em.createNativeQuery("CREATE TABLE tenant_1.parent(id bigint primary key)").executeUpdate();
+ em.createNativeQuery("CREATE TABLE tenant_2.parent(id bigint primary key)").executeUpdate();
+ em.createNativeQuery("CREATE TABLE tenant_1.children(id bigint NOT NULL, parent_id bigint, PRIMARY KEY " +
+ "(id), CONSTRAINT parent_fkey FOREIGN KEY (parent_id) REFERENCES tenant_1.parent (id))")
+ .executeUpdate();
+ em.createNativeQuery("CREATE TABLE tenant_2.children(id bigint NOT NULL, parent_id bigint, PRIMARY KEY " +
+ "(id), CONSTRAINT parent_fkey FOREIGN KEY (parent_id) REFERENCES tenant_2.parent (id))")
+ .executeUpdate();
+ em.createNativeQuery("INSERT INTO tenant_1.parent(id) VALUES(1)").executeUpdate();
+ em.createNativeQuery("INSERT INTO tenant_2.parent(id) VALUES(2)").executeUpdate();
+ em.createNativeQuery("INSERT INTO tenant_1.children(id, parent_id) VALUES(10, 1)").executeUpdate();
+ em.createNativeQuery("INSERT INTO tenant_2.children(id, parent_id) VALUES(11, 2)").executeUpdate();
+ em.getTransaction().commit();
+ } finally {
+ if (em.getTransaction().isActive()) {
+ em.getTransaction().rollback();
+ }
+ if (em.isOpen()) {
+ em.close();
+ }
}
}
}
@Test
public void testMultitenancySchemaDescriminatorWithOneToMany() {
- boolean awaitTermination = false;
- List<Future<ParentMultitenant>> parent1Results = new ArrayList<>();
- List<Future<ParentMultitenant>> parent2Results = new ArrayList<>();
- try {
- ExecutorService es = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
- for (int i = 1; i <= 10000; i++) {
- parent1Results.add(es.submit(() -> load("tenant_1", 1L)));
- parent2Results.add(es.submit(() -> load("tenant_2", 2L)));
+ if (supportedPlatform) {
+ boolean awaitTermination = false;
+ List<Future<ParentMultitenant>> parent1Results = new ArrayList<>();
+ List<Future<ParentMultitenant>> parent2Results = new ArrayList<>();
+ try {
+ ExecutorService es = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
+ for (int i = 1; i <= 10000; i++) {
+ parent1Results.add(es.submit(() -> load("tenant_1", 1L)));
+ parent2Results.add(es.submit(() -> load("tenant_2", 2L)));
+ }
+ es.shutdown();
+ awaitTermination = es.awaitTermination(10, TimeUnit.MINUTES);
+ for (Future<ParentMultitenant> parentFuture : parent1Results) {
+ ParentMultitenant parent = parentFuture.get();
+ assertEquals(1L, (long) parent.getId());
+ assertEquals(10L, (long) parent.getChildren().get(0).getId());
+ }
+ for (Future<ParentMultitenant> parentFuture : parent2Results) {
+ ParentMultitenant parent = parentFuture.get();
+ assertEquals(2L, (long) parent.getId());
+ assertEquals(11L, (long) parent.getChildren().get(0).getId());
+ }
+ } catch (Exception e) {
+ StringWriter sw = new StringWriter();
+ PrintWriter pw = new PrintWriter(sw);
+ e.printStackTrace(pw);
+ fail("Exception was caught: " + sw.toString());
}
- es.shutdown();
- awaitTermination = es.awaitTermination(10, TimeUnit.MINUTES);
- for (Future<ParentMultitenant> parentFuture : parent1Results) {
- ParentMultitenant parent = parentFuture.get();
- assertEquals(1L, (long) parent.getId());
- assertEquals(10L, (long) parent.getChildren().get(0).getId());
+ if (!awaitTermination) {
+ fail("timeout elapsed before termination of the threads");
}
- for (Future<ParentMultitenant> parentFuture : parent2Results) {
- ParentMultitenant parent = parentFuture.get();
- assertEquals(2L, (long) parent.getId());
- assertEquals(11L, (long) parent.getChildren().get(0).getId());
- }
- } catch (Exception e) {
- StringWriter sw = new StringWriter();
- PrintWriter pw = new PrintWriter(sw);
- e.printStackTrace(pw);
- fail("Exception was caught: " + sw.toString());
- }
- if (!awaitTermination) {
- fail("timeout elapsed before termination of the threads");
}
}