Skip to content

Commit

Permalink
JPA Example
Browse files Browse the repository at this point in the history
- added JPA Example

Signed-off-by: Mark Hoffmann <m.hoffmann@data-in-motion.biz>
  • Loading branch information
maho7791 committed Nov 22, 2023
1 parent f84ee53 commit 36587b8
Show file tree
Hide file tree
Showing 22 changed files with 1,886 additions and 969 deletions.
12 changes: 11 additions & 1 deletion cnf/central.maven
Original file line number Diff line number Diff line change
Expand Up @@ -213,4 +213,14 @@ jakarta.enterprise:jakarta.enterprise.cdi-api:2.0.2
jakarta.interceptor:jakarta.interceptor-api:1.2.5
org.apache.felix:org.apache.felix.http.whiteboard:2.3.2


# Derby
org.apache.derby:derby:10.14.2.0
org.ops4j.pax.jdbc:pax-jdbc-derby:1.5.5

#Eclipselink
org.eclipse.persistence:org.eclipse.persistence.moxy:4.0.0
org.eclipse.persistence:org.eclipse.persistence.jpa:4.0.0
org.eclipse.persistence:org.eclipse.persistence.jpa.jpql:4.0.0
org.eclipse.persistence:org.eclipse.persistence.core:4.0.0
org.eclipse.persistence:org.eclipse.persistence.asm:9.4.0
jakarta.persistence:jakarta.persistence-api:3.1.0
2,199 changes: 1,231 additions & 968 deletions cnf/local/index.xml

Large diffs are not rendered by default.

Binary file not shown.
Binary file not shown.
Binary file not shown.
7 changes: 7 additions & 0 deletions org.gecko.playground.jpa/.classpath
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-17"/>
<classpathentry kind="con" path="aQute.bnd.classpath.container"/>
<classpathentry kind="src" output="bin" path="src"/>
<classpathentry kind="output" path="bin"/>
</classpath>
2 changes: 2 additions & 0 deletions org.gecko.playground.jpa/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
/derby.log
/Database/
23 changes: 23 additions & 0 deletions org.gecko.playground.jpa/.project
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>org.gecko.playground.jpa</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>bndtools.core.bndbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>bndtools.core.bndnature</nature>
</natures>
</projectDescription>
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
eclipse.preferences.version=1
encoding/<project>=UTF-8
encoding/bnd.bnd=UTF-8
10 changes: 10 additions & 0 deletions org.gecko.playground.jpa/.settings/org.eclipse.jdt.core.prefs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=17
org.eclipse.jdt.core.compiler.compliance=17
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.release=enabled
org.eclipse.jdt.core.compiler.source=17
24 changes: 24 additions & 0 deletions org.gecko.playground.jpa/bnd.bnd
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
-buildpath: \
jakarta.persistence-api;version=latest,\
org.osgi.framework;version=latest,\
org.osgi.util.tracker;version=latest,\
org.osgi.service.jpa;version=latest,\
org.eclipse.persistence.jpa;version=latest,\
org.eclipse.persistence.core;version=latest,\
org.eclipse.emf.ecore;version=latest

-includeresource: \
META-INF/persistence.xml=persistence.xml
Meta-Persistence: META-INF/persistence.xml

-privatepackage: \
org.gecko.playground.jpa,\
org.gecko.playground.jpa.classloader

Require-Capability: \
osgi.extender;filter:='(osgi.extender=osgi.configurator)'

Export-Package: org.gecko.playground.jpa.entities
Import-Package: \
org.eclipse.persistence.internal.dynamic;version='[4.0.0,5.0.0)',\
*
37 changes: 37 additions & 0 deletions org.gecko.playground.jpa/launch.bndrun
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
-runrequires: \
bnd.identity;id='org.apache.felix.gogo.command',\
bnd.identity;id='org.apache.felix.gogo.shell',\
bnd.identity;id='org.eclipse.gemini.jpa',\
bnd.identity;id='org.eclipse.persistence.jpa.jpql',\
bnd.identity;id='org.gecko.persistence.derby',\
bnd.identity;id='org.apache.aries.spifly.dynamic.framework.extension',\
bnd.identity;id='org.gecko.playground.jpa',\
bnd.identity;id=derby
-runfw: org.apache.felix.framework;version='[7.0.5,7.0.5]'
-runee: JavaSE-17
-runbundles: \
org.apache.felix.gogo.command;version='[1.1.2,1.1.3)',\
org.apache.felix.gogo.shell;version='[1.1.4,1.1.5)',\
jakarta.persistence-api;version='[3.1.0,3.1.1)',\
org.eclipse.persistence.asm;version='[9.4.0,9.4.1)',\
org.eclipse.persistence.core;version='[4.0.0,4.0.1)',\
org.eclipse.persistence.jpa;version='[4.0.0,4.0.1)',\
org.eclipse.persistence.jpa.jpql;version='[4.0.0,4.0.1)',\
org.osgi.service.jdbc;version='[1.1.0,1.1.1)',\
org.osgi.service.jpa;version='[3.1.1,3.1.2)',\
derby;version='[10.14.2000000,10.14.2000001)',\
org.apache.aries.spifly.dynamic.framework.extension;version='[1.3.6,1.3.7)',\
org.apache.felix.cm.json;version='[2.0.0,2.0.1)',\
org.apache.felix.configurator;version='[1.0.18,1.0.19)',\
org.apache.felix.gogo.runtime;version='[1.1.6,1.1.7)',\
org.apache.felix.scr;version='[2.2.6,2.2.7)',\
org.eclipse.gemini.jpa;version='[1.0.0,1.0.1)',\
org.eclipse.parsson.jakarta.json;version='[1.1.2,1.1.3)',\
org.gecko.persistence.derby;version='[1.0.0,1.0.1)',\
org.gecko.playground.jpa;version=snapshot,\
org.osgi.service.component;version='[1.5.1,1.5.2)',\
org.osgi.util.converter;version='[1.0.9,1.0.10)',\
org.osgi.util.function;version='[1.2.0,1.2.1)',\
org.osgi.util.promise;version='[1.3.0,1.3.1)',\
org.apache.felix.configadmin;version='[1.9.26,1.9.27)'
-runblacklist: bnd.identity;id='org.osgi.service.cm'
36 changes: 36 additions & 0 deletions org.gecko.playground.jpa/persistence.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">

<persistence-unit name="Accounts" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>

<class>org.gecko.playground.jpa.entities.Account</class>
<class>org.gecko.playground.jpa.entities.Customer</class>
<class>org.gecko.playground.jpa.entities.Transaction</class>
<class>org.gecko.playground.jpa.entities.TxOperation</class>

<exclude-unlisted-classes>true</exclude-unlisted-classes>

<properties>
<property name="eclipselink.target-database" value="Derby"/>
<property name="jakarta.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver"/>
<property name="jakarta.persistence.jdbc.url" value="jdbc:derby:Database;create=true"/>
<property name="jakarta.persistence.jdbc.user" value="app"/>
<property name="jakarta.persistence.jdbc.password" value="app"/>

<property name="eclipselink.logging.level" value="FINE"/>
<property name="eclipselink.logging.timestamp" value="false"/>
<property name="eclipselink.logging.thread" value="false"/>
<property name="eclipselink.logging.exceptions" value="true"/>
<property name="eclipselink.orm.throw.exceptions" value="true"/>
<property name="eclipselink.jdbc.read-connections.min" value="1"/>
<property name="eclipselink.jdbc.write-connections.min" value="1"/>
<property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
<property name="eclipselink.weaving" value="true"/>

</properties>
</persistence-unit>
</persistence>
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
/*******************************************************************************
* Copyright (c) 2010 Oracle.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Apache License v2.0 which accompanies this distribution.
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html
* and the Apache License v2.0 is available at
* http://www.opensource.org/licenses/apache2.0.php.
* You may elect to redistribute this code under either of these licenses.
*
* Contributors:
* mkeith - Gemini JPA sample
******************************************************************************/
package org.gecko.playground.jpa;

import java.util.Date;
import java.util.List;

import org.eclipse.persistence.dynamic.DynamicClassLoader;
import org.eclipse.persistence.dynamic.DynamicEntity;
import org.eclipse.persistence.dynamic.DynamicTypeBuilder;
import org.eclipse.persistence.jpa.dynamic.JPADynamicHelper;
import org.eclipse.persistence.queries.ReadAllQuery;
import org.gecko.playground.jpa.classloader.OSGiJPADynamicHelper;
import org.gecko.playground.jpa.entities.Account;
import org.gecko.playground.jpa.entities.Customer;

import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.TypedQuery;

/**
* Gemini JPA sample client class
*
* @author mkeith
*/
public class AccountClient {

public void run(EntityManagerFactory emf) {
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();

Customer c = new Customer("Chan", "Jackie", "1034 KingFu Lane, Los Angeles, CA");
em.persist(c);
Account a = new Account(c);
a.setBalance(100.0);
em.persist(a);

em.getTransaction().commit();

TypedQuery<Account> q = em.createQuery("SELECT a FROM Account a", Account.class);
List<Account> results = q.getResultList();
System.out.println("\n*** Account Report ***");
for (Account acct : results) {
System.out.println("Account: " + acct);
}
em.close();
}
@SuppressWarnings("unchecked")
public void runDynamic(EntityManagerFactory emf) {
EntityManager em = emf.createEntityManager();
JPADynamicHelper helper = new OSGiJPADynamicHelper(em);
DynamicClassLoader dcl = helper.getDynamicClassLoader();
Class<?> employeeClass= dcl.createDynamicClass("scott.Emp");
Class<?> deptClass= dcl.createDynamicClass("scott.Dept");
DynamicTypeBuilder employeeBuilder = new DynamicTypeBuilder(employeeClass,
null /*no parent type*/, "EMP");
DynamicTypeBuilder deptBuilder = new DynamicTypeBuilder(deptClass,
null /*no parent type*/, "DEPT");
employeeBuilder.setPrimaryKeyFields("EMPNO");
employeeBuilder.addDirectMapping("employeeNumber", int.class, "EMPNO");
employeeBuilder.addDirectMapping("name", String.class, "ENAME");
employeeBuilder.addDirectMapping("job", String.class, "JOB");
employeeBuilder.addDirectMapping("hiredOn", Date.class, "HIREDATE");
employeeBuilder.addDirectMapping("salaryPerWeek", int.class, "SAL");
employeeBuilder.addDirectMapping("commision", int.class, "COMM");
employeeBuilder.addOneToOneMapping("manager", employeeBuilder.getType(), "MGR");
deptBuilder.setPrimaryKeyFields("DEPTNO");
deptBuilder.addDirectMapping("deptNumber", int.class, "DEPTNO");
deptBuilder.addDirectMapping("name", String.class, "DNAME");
deptBuilder.addDirectMapping("location", String.class, "LOC");
employeeBuilder.addOneToOneMapping("department", deptBuilder.getType(), "DEPTNO");


helper.addTypes(true /*create tables*/, true /*create constraints*/,
employeeBuilder.getType(), deptBuilder.getType());

DynamicEntity deptEntity = deptBuilder.getType().newDynamicEntity();
deptEntity.set("deptNumber", 12);
deptEntity.set("name", "digitalization");
deptEntity.set("location", "Jena DIMC Office");

DynamicEntity employeeEntity = employeeBuilder.getType().newDynamicEntity();
employeeEntity.set("employeeNumber", 1);
employeeEntity.set("name", "Mark");
employeeEntity.set("job", "CTO");
// employeeEntity.set("hiredOn", new Date());
employeeEntity.set("salaryPerWeek", 1750);
employeeEntity.set("commision", 42);
employeeEntity.set("department", deptEntity);

ReadAllQuery query = helper.newReadAllQuery("Emp");
List<DynamicEntity> employees = (List<DynamicEntity>)helper.getSession().executeQuery(query);
if (employees.isEmpty()) {
em.getTransaction().begin();
em.persist(deptEntity);
em.persist(employeeEntity);
em.getTransaction().commit();
}

//query.addAscendingOrdering("employeeNumber");
query.addAscendingOrdering("name");
System.out.println("Employees-Size " + employees.size());
employees.forEach(e->{
System.out.println("Employee " + e.get("name"));
DynamicEntity dept = e.get("department");
System.out.println("Employee Department " + dept.get("name"));

});
em.close();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/**
* Copyright (c) 2012 - 2023 Data In Motion and others.
* All rights reserved.
*
* This program and the accompanying materials are made available under the terms of the
* Eclipse Public License v2.0 which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* Data In Motion - initial API and implementation
*/
package org.gecko.playground.jpa;

import org.osgi.framework.BundleContext;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.osgi.service.jpa.EntityManagerFactoryBuilder;

import jakarta.persistence.EntityManagerFactory;

/**
* https://wiki.eclipse.org/EclipseLink/Examples/JPA/Dynamic
* https://wiki.eclipse.org/EclipseLink/Examples/JPA/Dynamic/CustomizeAttributes
* https://wiki.eclipse.org/EclipseLink/Examples/Foundation/DynamicPersistence
*
* @author mark
* @since 13.01.2023
*/
@Component
public class TestComponent {

@Reference(target = "(" + EntityManagerFactoryBuilder.JPA_UNIT_NAME + "=Accounts)")
private EntityManagerFactory emf;


@Activate
public void activate(BundleContext ctx) {
System.out.println("Got basic model");
System.out.println("Gemini JPA Account Sample started");
new AccountClient().run(emf);
}

}

0 comments on commit 36587b8

Please sign in to comment.