getQualifiers() {
+ return qualifiers;
+ }
+
+ @Override
+ public String getId() {
+ return type.getName() + '@' + DatabaseType.DOCUMENT + "-" + provider;
+ }
+
+}
\ No newline at end of file
diff --git a/jnosql-jakarta-persistence/jnosql-jakarta-persistence-driver/src/main/java/org/eclipse/jnosql/jakartapersistence/mapping/spi/JakartaPersistenceExtension.java b/jnosql-jakarta-persistence/jnosql-jakarta-persistence-driver/src/main/java/org/eclipse/jnosql/jakartapersistence/mapping/spi/JakartaPersistenceExtension.java
new file mode 100644
index 00000000..c6fca41e
--- /dev/null
+++ b/jnosql-jakarta-persistence/jnosql-jakarta-persistence-driver/src/main/java/org/eclipse/jnosql/jakartapersistence/mapping/spi/JakartaPersistenceExtension.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2022 Contributors to the Eclipse Foundation
+ * 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:
+ *
+ * Otavio Santana
+ */
+package org.eclipse.jnosql.jakartapersistence.mapping.spi;
+
+import org.eclipse.jnosql.jakartapersistence.communication.PersistenceClassScanner;
+import jakarta.enterprise.event.Observes;
+import jakarta.enterprise.inject.spi.AfterBeanDiscovery;
+import jakarta.enterprise.inject.spi.Extension;
+import org.eclipse.jnosql.mapping.document.query.RepositoryDocumentBean;
+import org.eclipse.jnosql.mapping.metadata.ClassScanner;
+
+import java.util.Set;
+import java.util.logging.Logger;
+
+/**
+ * This CDI extension, {@code JakartaPersistenceExtension}, observes the CDI container lifecycle events to perform tasks
+ * related to Jakarta Persistence repository beans.
+ *
+ */
+public class JakartaPersistenceExtension implements Extension {
+
+ private static final Logger LOGGER = Logger.getLogger(JakartaPersistenceExtension.class.getName());
+
+ void onAfterBeanDiscovery(@Observes final AfterBeanDiscovery afterBeanDiscovery) {
+
+ ClassScanner scanner = new PersistenceClassScanner();
+
+ Set> crudTypes = scanner.repositoriesStandard();
+
+ LOGGER.info(() -> "Processing Jakarta Persistence extension: crud "
+ + crudTypes.size() + " found");
+ LOGGER.fine(() -> "Processing repositories as a Jakarta Persistence implementation: " + crudTypes);
+
+ crudTypes.forEach(type -> {
+ afterBeanDiscovery.addBean(new RepositoryDocumentBean<>(type, ""));
+ });
+
+ }
+}
\ No newline at end of file
diff --git a/jnosql-jakarta-persistence/jnosql-jakarta-persistence-driver/src/main/resources/META-INF/beans.xml b/jnosql-jakarta-persistence/jnosql-jakarta-persistence-driver/src/main/resources/META-INF/beans.xml
new file mode 100644
index 00000000..029572ac
--- /dev/null
+++ b/jnosql-jakarta-persistence/jnosql-jakarta-persistence-driver/src/main/resources/META-INF/beans.xml
@@ -0,0 +1,23 @@
+
+
+
+
\ No newline at end of file
diff --git a/jnosql-jakarta-persistence/jnosql-jakarta-persistence-driver/src/main/resources/META-INF/services/jakarta.enterprise.inject.spi.Extension b/jnosql-jakarta-persistence/jnosql-jakarta-persistence-driver/src/main/resources/META-INF/services/jakarta.enterprise.inject.spi.Extension
new file mode 100644
index 00000000..f3c4099d
--- /dev/null
+++ b/jnosql-jakarta-persistence/jnosql-jakarta-persistence-driver/src/main/resources/META-INF/services/jakarta.enterprise.inject.spi.Extension
@@ -0,0 +1,15 @@
+#
+# Copyright (c) 2022 Contributors to the Eclipse Foundation
+# 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:
+#
+# Ondro Mihalyi
+#
+org.eclipse.jnosql.jakartapersistence.mapping.spi.JakartaPersistenceExtension
\ No newline at end of file
diff --git a/jnosql-jakarta-persistence/jnosql-jakarta-persistence-driver/src/test/java/ee/omnifish/jnosql/jakartapersistence/EntityManagerProducer.java b/jnosql-jakarta-persistence/jnosql-jakarta-persistence-driver/src/test/java/ee/omnifish/jnosql/jakartapersistence/EntityManagerProducer.java
new file mode 100644
index 00000000..5c2ffed1
--- /dev/null
+++ b/jnosql-jakarta-persistence/jnosql-jakarta-persistence-driver/src/test/java/ee/omnifish/jnosql/jakartapersistence/EntityManagerProducer.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2024 Contributors to the Eclipse Foundation
+ * 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:
+ *
+ * Ondro Mihalyi
+ */
+package ee.omnifish.jnosql.jakartapersistence;
+
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.enterprise.inject.Disposes;
+import jakarta.enterprise.inject.Produces;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.Persistence;
+
+@ApplicationScoped
+public class EntityManagerProducer {
+ @Produces
+ @ApplicationScoped
+ public EntityManager createEntityManager() {
+ return Persistence.createEntityManagerFactory("testPersistenceUnit")
+ .createEntityManager();
+ }
+
+ public void closeEntityManager(@Disposes EntityManager entityManager) {
+ entityManager.close();
+ }
+}
diff --git a/jnosql-jakarta-persistence/jnosql-jakarta-persistence-driver/src/test/java/ee/omnifish/jnosql/jakartapersistence/Person.java b/jnosql-jakarta-persistence/jnosql-jakarta-persistence-driver/src/test/java/ee/omnifish/jnosql/jakartapersistence/Person.java
new file mode 100644
index 00000000..ce53f8ca
--- /dev/null
+++ b/jnosql-jakarta-persistence/jnosql-jakarta-persistence-driver/src/test/java/ee/omnifish/jnosql/jakartapersistence/Person.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2024 Contributors to the Eclipse Foundation
+ * 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:
+ *
+ * Ondro Mihalyi
+ */
+package ee.omnifish.jnosql.jakartapersistence;
+
+import static jakarta.persistence.GenerationType.AUTO;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.Id;
+import java.util.List;
+
+@Entity(name = "Person")
+public class Person {
+
+ @Id
+ @GeneratedValue(strategy = AUTO)
+ private long id;
+
+ @Column
+ private String name;
+
+ @Column
+ private long age;
+
+ @Column
+ private List phones;
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public List getPhones() {
+ return phones;
+ }
+
+ public void setPhones(List phones) {
+ this.phones = phones;
+ }
+
+ public long getAge() {
+ return age;
+ }
+
+ public void setAge(long age) {
+ this.age = age;
+ }
+
+
+}
diff --git a/jnosql-jakarta-persistence/jnosql-jakarta-persistence-driver/src/test/java/ee/omnifish/jnosql/jakartapersistence/PersonRepository.java b/jnosql-jakarta-persistence/jnosql-jakarta-persistence-driver/src/test/java/ee/omnifish/jnosql/jakartapersistence/PersonRepository.java
new file mode 100644
index 00000000..e457b064
--- /dev/null
+++ b/jnosql-jakarta-persistence/jnosql-jakarta-persistence-driver/src/test/java/ee/omnifish/jnosql/jakartapersistence/PersonRepository.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2024 Contributors to the Eclipse Foundation
+ * 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:
+ *
+ * Ondro Mihalyi
+ */
+package ee.omnifish.jnosql.jakartapersistence;
+
+import jakarta.data.repository.CrudRepository;
+import jakarta.data.repository.Repository;
+import java.util.List;
+import java.util.Set;
+
+@Repository
+public interface PersonRepository extends CrudRepository {
+ long countAll();
+ long countByNameNotNull();
+ List findByNameAndAgeLessThanEqual(String name, long age);
+ List findByNameIn(Set names);
+}
+
diff --git a/jnosql-jakarta-persistence/jnosql-jakarta-persistence-driver/src/test/java/ee/omnifish/jnosql/jakartapersistence/PersonRepositoryTest.java b/jnosql-jakarta-persistence/jnosql-jakarta-persistence-driver/src/test/java/ee/omnifish/jnosql/jakartapersistence/PersonRepositoryTest.java
new file mode 100644
index 00000000..dcb07f32
--- /dev/null
+++ b/jnosql-jakarta-persistence/jnosql-jakarta-persistence-driver/src/test/java/ee/omnifish/jnosql/jakartapersistence/PersonRepositoryTest.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright (c) 2024 Contributors to the Eclipse Foundation
+ * 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:
+ *
+ * Ondro Mihalyi
+ */
+package ee.omnifish.jnosql.jakartapersistence;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.empty;
+import static org.hamcrest.Matchers.greaterThan;
+import static org.hamcrest.Matchers.hasSize;
+import static org.hamcrest.Matchers.not;
+
+import jakarta.enterprise.inject.se.SeContainer;
+import jakarta.enterprise.inject.se.SeContainerInitializer;
+import jakarta.persistence.EntityManager;
+import java.util.List;
+import java.util.Set;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+public class PersonRepositoryTest {
+
+ private SeContainer cdiContainer;
+ private PersonRepository personRepo;
+
+ @BeforeEach
+ void init() {
+ cdiContainer = SeContainerInitializer.newInstance()
+ .addBeanClasses(EntityManagerProducer.class)
+ .initialize();
+ assertThat("repository can be resolved", cdiContainer.select(PersonRepository.class).isResolvable());
+ personRepo = cdiContainer.select(PersonRepository.class).get();
+
+ // cleanup
+ getEntityManager().getTransaction().begin();
+ getEntityManager().createQuery("delete from Person p").executeUpdate();
+ getEntityManager().getTransaction().commit();
+
+ getEntityManager().getTransaction().begin();
+ }
+
+ private EntityManager getEntityManager() {
+ return cdiContainer.select(EntityManager.class).get();
+ }
+
+ @AfterEach
+ void cleanup() {
+ getEntityManager().getTransaction().commit();
+ cdiContainer.close();
+ }
+
+ @Test
+ void findAll() {
+ final List persons = personRepo.findAll().toList();
+ assertThat("queryResult", persons, is(empty()));
+ System.out.println("All persons: " + persons);
+ }
+
+ @Test
+ void count() {
+ personRepo.insert(new Person());
+ final long count = personRepo.countAll();
+ assertThat(count, greaterThan(0L));
+ }
+
+ @Test
+ void countByNotNull() {
+ new PersonBuilder().name("Jakarta").insert(personRepo);
+ final long count = personRepo.countByNameNotNull();
+ assertThat(count, greaterThan(0L));
+ }
+
+ @Test
+ void findByXAndYLessThanEqual() {
+ final String NAME = "Jakarta";
+ new PersonBuilder().name(NAME).age(35).insert(personRepo);
+
+ final List persons = personRepo.findByNameAndAgeLessThanEqual(NAME, 50);
+ assertThat(persons, is(not(empty())));
+ }
+
+ @Test
+ void findByXIn() {
+ final String NAME1 = "Jakarta";
+ final String NAME2 = "JNoSQL";
+ final String NAME3 = "Data";
+ new PersonBuilder().name(NAME1).insert(personRepo);
+ new PersonBuilder().name(NAME2).insert(personRepo);
+ new PersonBuilder().name(NAME3).insert(personRepo);
+ new PersonBuilder().name("No name").insert(personRepo);
+
+ final List persons = personRepo.findByNameIn(Set.of(NAME1, NAME2, NAME3));
+ assertThat(persons, hasSize(3));
+ }
+
+ @Test
+ void hermesParser() {
+ getEntityManager().createQuery("UPDATE Person SET length = age + 1");
+ }
+
+ private class PersonBuilder {
+
+ Person p = new Person();
+
+ public PersonBuilder name(String name) {
+ p.setName(name);
+ return this;
+ }
+
+ public PersonBuilder age(long age) {
+ p.setAge(age);
+ return this;
+ }
+
+ public Person build() {
+ return p;
+ }
+
+ public void insert(PersonRepository personRepo) {
+ personRepo.insert(p);
+ }
+ }
+
+}
diff --git a/jnosql-jakarta-persistence/jnosql-jakarta-persistence-driver/src/test/resources/META-INF/persistence.xml b/jnosql-jakarta-persistence/jnosql-jakarta-persistence-driver/src/test/resources/META-INF/persistence.xml
new file mode 100644
index 00000000..442bfb96
--- /dev/null
+++ b/jnosql-jakarta-persistence/jnosql-jakarta-persistence-driver/src/test/resources/META-INF/persistence.xml
@@ -0,0 +1,40 @@
+
+
+
+
+ org.eclipse.persistence.jpa.PersistenceProvider
+ ee.omnifish.jnosql.jakartapersistence.Person
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/jnosql-jakarta-persistence/pom.xml b/jnosql-jakarta-persistence/pom.xml
new file mode 100644
index 00000000..6ef16097
--- /dev/null
+++ b/jnosql-jakarta-persistence/pom.xml
@@ -0,0 +1,32 @@
+
+
+
+ 4.0.0
+ Eclipse JNoSQL Jakarta Persistence Parent
+
+ org.eclipse.jnosql.mapping
+ jnosql-mapping-extensions
+ 1.1.2-SNAPSHOT
+
+ jnosql-jakarta-persistence-parent
+ pom
+
+ jnosql-jakarta-persistence-driver
+ jnosql-jakarta-persistence-data-tck-runner
+
+
\ No newline at end of file