From bbbcbd086e0201362626d36f4109bb02d99fd7ef Mon Sep 17 00:00:00 2001 From: Tomas Langer Date: Wed, 17 Jun 2020 23:23:04 +0200 Subject: [PATCH] Oracle with JPA Signed-off-by: Tomas Langer --- .../io/helidon/common/FeatureCatalog.java | 9 +++------ integrations/db/ojdbc/pom.xml | 6 ++++++ .../ojdbc/native-image.properties | 4 +++- .../ojdbc/reflect-config.json | 8 ++++++++ tests/integration/native-image/mp-2/README.md | 19 ++++++++++++++++--- .../nativeimage/mp2/JaxRsResource.java | 12 ++++++------ .../integration/nativeimage/mp2/Mp2Main.java | 6 ++++++ 7 files changed, 48 insertions(+), 16 deletions(-) diff --git a/common/common/src/main/java/io/helidon/common/FeatureCatalog.java b/common/common/src/main/java/io/helidon/common/FeatureCatalog.java index a67a398e476..4fe82c495d4 100644 --- a/common/common/src/main/java/io/helidon/common/FeatureCatalog.java +++ b/common/common/src/main/java/io/helidon/common/FeatureCatalog.java @@ -128,10 +128,6 @@ final class FeatureCatalog { "Tracing", "Tracing support", "Tracing"); - addSe("io.helidon.webclient", - "WebClient", - "Helidon WebClient", - "WebClient"); addSe("io.helidon.webserver", "WebServer", "Helidon WebServer", @@ -491,9 +487,10 @@ final class FeatureCatalog { exclude("io.helidon.config.spi"); exclude("io.helidon.config.mp"); exclude("io.helidon.config.mp.spi"); - exclude("io.helidon.dbclient.spi"); - exclude("io.helidon.dbclient.jdbc.spi"); exclude("io.helidon.dbclient.common"); + exclude("io.helidon.dbclient.jdbc.spi"); + exclude("io.helidon.dbclient.metrics.jdbc"); + exclude("io.helidon.dbclient.spi"); exclude("io.helidon.health.common"); exclude("io.helidon.integrations.cdi.delegates"); exclude("io.helidon.integrations.cdi.referencecountedcontext"); diff --git a/integrations/db/ojdbc/pom.xml b/integrations/db/ojdbc/pom.xml index c97b710bed4..14f8dadcf8f 100644 --- a/integrations/db/ojdbc/pom.xml +++ b/integrations/db/ojdbc/pom.xml @@ -38,6 +38,12 @@ com.oracle.ojdbc ojdbc10 + + + com.oracle.ojdbc + ucp + + diff --git a/integrations/db/ojdbc/src/main/resources/META-INF/native-image/io.helidon.integrations.db/ojdbc/native-image.properties b/integrations/db/ojdbc/src/main/resources/META-INF/native-image/io.helidon.integrations.db/ojdbc/native-image.properties index a768ad256eb..0e6e134ccbe 100644 --- a/integrations/db/ojdbc/src/main/resources/META-INF/native-image/io.helidon.integrations.db/ojdbc/native-image.properties +++ b/integrations/db/ojdbc/src/main/resources/META-INF/native-image/io.helidon.integrations.db/ojdbc/native-image.properties @@ -33,4 +33,6 @@ Args= --allow-incomplete-classpath \ --initialize-at-run-time=oracle.net.nt.Clock \ --initialize-at-run-time=oracle.net.nt.TcpMultiplexer \ --initialize-at-run-time=oracle.net.nt.TcpMultiplexer \ - --initialize-at-run-time=oracle.net.nt.TcpMultiplexer$LazyHolder + --initialize-at-run-time=oracle.net.nt.TcpMultiplexer$LazyHolder \ + --initialize-at-run-time=oracle.jdbc.driver.SQLUtil$XMLFactory \ + --initialize-at-run-time=oracle.jdbc.driver.NamedTypeAccessor$XMLFactory diff --git a/integrations/db/ojdbc/src/main/resources/META-INF/native-image/io.helidon.integrations.db/ojdbc/reflect-config.json b/integrations/db/ojdbc/src/main/resources/META-INF/native-image/io.helidon.integrations.db/ojdbc/reflect-config.json index 4e460f36b8f..5b915ff8d63 100644 --- a/integrations/db/ojdbc/src/main/resources/META-INF/native-image/io.helidon.integrations.db/ojdbc/reflect-config.json +++ b/integrations/db/ojdbc/src/main/resources/META-INF/native-image/io.helidon.integrations.db/ojdbc/reflect-config.json @@ -1,4 +1,12 @@ [ + { + "name": "org.hibernate.dialect.Oracle10gDialect", + "allDeclaredConstructors": true, + "allDeclaredMethods": true, + "allPublicMethods": true, + "allDeclaredFields": true, + "allPublicFields": true + }, { "name": "oracle.jdbc.internal.ACProxyable", "methods": [ diff --git a/tests/integration/native-image/mp-2/README.md b/tests/integration/native-image/mp-2/README.md index 047a7fb6bee..82d7f2275fa 100644 --- a/tests/integration/native-image/mp-2/README.md +++ b/tests/integration/native-image/mp-2/README.md @@ -16,11 +16,24 @@ Requires at least GraalVM 20.0.0 This test validates that JPA integration (using Hibernate) and JTA integration work in native image. -This test requires a running h2 database on `jdbc:h2:tcp://localhost:9092/test` +This test requires a running oracle database on `jdbc:oracle:thin:@localhost:1521/XE` + username `system`, password `oracle` (or modify `microprofile-config.properties` to match your DB) with the following table and data: -`CREATE TABLE GREETING (FIRSTPART VARCHAR NOT NULL, SECONDPART VARCHAR NOT NULL, PRIMARY KEY (FIRSTPART))` +```sql +CREATE TABLE GREETING (FIRSTPART VARCHAR2(100), SECONDPART VARCHAR2(100), PRIMARY KEY (FIRSTPART)) +INSERT INTO GREETING (FIRSTPART, SECONDPART) VALUES ('Jack', 'The Ripper') +``` -`INSERT INTO GREETING (FIRSTPART, SECONDPART) VALUES ('Jack', 'The Ripper')` +Once the test is done against Oracle DB database, switch to h2: +Make sure the table exists and contains expected data: +```sql +CREATE TABLE GREETING (FIRSTPART VARCHAR NOT NULL, SECONDPART VARCHAR NOT NULL, PRIMARY KEY (FIRSTPART)) +INSERT INTO GREETING (FIRSTPART, SECONDPART) VALUES ('Jack', 'The Ripper') +``` + +1. Comment out `ojdbc` and uncomment `h2` in `pom.xml` +2. Comment out `org.hibernate.dialect.Oracle10gDialect"` and uncomment `org.hibernate.dialect.H2Dialect` in `persistence.xml` +3. Comment out all oracle driver properties and uncomment all h2 driver properties in `microprofile-config.properties` diff --git a/tests/integration/native-image/mp-2/src/main/java/io/helidon/tests/integration/nativeimage/mp2/JaxRsResource.java b/tests/integration/native-image/mp-2/src/main/java/io/helidon/tests/integration/nativeimage/mp2/JaxRsResource.java index 1cf6202e93e..455eef17eb0 100644 --- a/tests/integration/native-image/mp-2/src/main/java/io/helidon/tests/integration/nativeimage/mp2/JaxRsResource.java +++ b/tests/integration/native-image/mp-2/src/main/java/io/helidon/tests/integration/nativeimage/mp2/JaxRsResource.java @@ -19,7 +19,6 @@ import javax.inject.Inject; import javax.persistence.EntityManager; -import javax.persistence.EntityNotFoundException; import javax.persistence.PersistenceContext; import javax.transaction.Transaction; import javax.transaction.Transactional; @@ -75,14 +74,15 @@ public Response post(@PathParam("firstPart") String firstPart, String secondPart GreetingEntity greeting; boolean created = false; - try { - greeting = this.entityManager.getReference(GreetingEntity.class, firstPart); - greeting.setSecondPart(secondPart); - //entityManager.persist(greeting); - } catch (EntityNotFoundException entityNotFoundException) { + + greeting = this.entityManager.find(GreetingEntity.class, firstPart); + + if (greeting == null) { greeting = new GreetingEntity(firstPart, secondPart); entityManager.persist(greeting); created = true; + } else { + greeting.setSecondPart(secondPart); } if (created) { diff --git a/tests/integration/native-image/mp-2/src/main/java/io/helidon/tests/integration/nativeimage/mp2/Mp2Main.java b/tests/integration/native-image/mp-2/src/main/java/io/helidon/tests/integration/nativeimage/mp2/Mp2Main.java index 4d67cdf8639..e123310ce8a 100644 --- a/tests/integration/native-image/mp-2/src/main/java/io/helidon/tests/integration/nativeimage/mp2/Mp2Main.java +++ b/tests/integration/native-image/mp-2/src/main/java/io/helidon/tests/integration/nativeimage/mp2/Mp2Main.java @@ -81,6 +81,12 @@ private static void validateDb(Errors.Collector collector, WebTarget target) { response = jack.request().get(); validateResponse(response, collector, path, "Sparrow"); + + response = jack.request().post(Entity.text("The Ripper")); + validateResponse(response, collector, path, "Jack"); + + response = jack.request().get(); + validateResponse(response, collector, path, "The Ripper"); } private static void validateResponse(Response response, Errors.Collector collector, String path, String expected) {