0

I'm trying to create a JPA in Ktor that can access MySQL and MongoDB using the same application. The MySQL part is working fine. But I'm unable to connect with mongoDb. I'm getting the error message

jakarta.persistence.PersistenceException: No Persistence provider for EntityManager named Mdb

It is unable to detect the MongoDB persistence provider. I'm attaching all my files below.

persistence.xml file in /Kotlin/JPA/src/main/resources/META-INF/persistence.xml.

<?xml version="1.0" encoding="UTF-8"?>

<!--    <persistence version="3.0" xmlns="https://jakarta.ee/xml/ns/persistence">-->

<persistence 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_2_0.xsd"
             version="2.0">

        <persistence-unit name="pu">
            <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>


            <class>com.example.data.Student</class>

            <properties>
                <property name="jakarta.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>

                <property name="jakarta.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/Students"/>
                <property name="jakarta.persistence.jdbc.user" value="root"/>
                <property name="jakarta.persistence.jdbc.password" value="mynewpassword"/>
            </properties>
        </persistence-unit>

<persistence-unit name="Mdb" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ogm.jpa.HibernateOgmPersistence</provider>

    <class>com.example.data.Student</class>

    <properties>

        <property name="hibernate.ogm.datastore.provider" value="mongodb"/>
        <property name="hibernate.ogm.datastore.host" value="localhost:27017"/>
        <property name="hibernate.ogm.datastore.database" value="databasename"/>
        <property name="hibernate.ogm.datastore.create_database" value="true"/>

    </properties>

</persistence-unit>

    </persistence>

Routing. kt file in plugins

fun Application.configureRouting() {
        install(ContentNegotiation) {
            json()
    }

    routing {
        get("/") {
            call.respondText("Hello World!")
        }

        get("/jpa") {
            val a =  Student(3, "George", "Python")

      val emf: EntityManagerFactory = Persistence.createEntityManagerFactory("Mdb")
            val em: EntityManager = emf.createEntityManager()

            em.transaction.begin()
            em.persist(a)
            em.transaction.commit()
            println(a)

            call.respond(HttpStatusCode.OK, "Working")
        }
    }
}

Entity class

package com.example.data

import jakarta.persistence.Entity
import jakarta.persistence.Id

@Entity
class Student(
    @Id
    val id: Int,
    val name: String,
    val tech: String
)

Similar to pom.xml in java application, I used build.gradle.kts for it.

build.gradle.kts

val ktor_version: String by project
val kotlin_version: String by project
val logback_version: String by project

dependencies {
    implementation("io.ktor:ktor-server-core-jvm:$ktor_version")
    implementation("io.ktor:ktor-server-locations-jvm:$ktor_version")
    implementation("io.ktor:ktor-server-content-negotiation-jvm:$ktor_version")
    implementation("io.ktor:ktor-serialization-jackson-jvm:$ktor_version")
    implementation("io.ktor:ktor-serialization-gson-jvm:$ktor_version")
    implementation("io.ktor:ktor-serialization-kotlinx-json-jvm:$ktor_version")
    implementation("io.ktor:ktor-server-netty-jvm:$ktor_version")
    implementation("ch.qos.logback:logback-classic:$logback_version")
    testImplementation("io.ktor:ktor-server-tests-jvm:$ktor_version")
    testImplementation("org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version")
    implementation("org.jetbrains.kotlin:kotlin-maven-plugin:1.2.30")
    implementation("org.jetbrains.kotlin:kotlin-maven-noarg:1.2.30")
    implementation("org.hibernate:hibernate-core:6.1.0.Final")
    implementation("org.jetbrains.exposed:exposed-dao:0.38.2")
    implementation("org.jetbrains.exposed:exposed-jdbc:0.38.2")
    implementation("org.ktorm:ktorm-core:3.5.0")
     implementation("mysql:mysql-connector-java:8.0.29")
    implementation("org.mongodb:mongo-java-driver:3.12.11")
    implementation ("org.hibernate.ogm:hibernate-ogm-mongodb:5.4.1.Final")
    implementation("jakarta.transaction:jakarta.transaction-api:2.0.1")
//  implementation("javax.transaction:jta:1.1")
//  implementation("org.hibernate:hibernate-entitymanager:6.0.0.Alpha7")


}

Error message logs

2022-07-22 18:29:58.431 [eventLoopGroupProxy-4-1] TRACE o.h.j.b.i.PersistenceXmlParser - Persistence unit name from persistence.xml : Mdb
2022-07-22 18:29:58.431 [eventLoopGroupProxy-4-1] DEBUG o.h.jpa.HibernatePersistenceProvider - Located and parsed 2 persistence units; checking each
2022-07-22 18:29:58.431 [eventLoopGroupProxy-4-1] DEBUG o.h.jpa.HibernatePersistenceProvider - Checking persistence-unit [name=pu, explicit-provider=org.hibernate.jpa.HibernatePersistenceProvider] against incoming persistence unit name [Mdb]
2022-07-22 18:29:58.431 [eventLoopGroupProxy-4-1] DEBUG o.h.jpa.HibernatePersistenceProvider - Excluding from consideration due to name mis-match
2022-07-22 18:29:58.431 [eventLoopGroupProxy-4-1] DEBUG o.h.jpa.HibernatePersistenceProvider - Checking persistence-unit [name=Mdb, explicit-provider=org.hibernate.ogm.jpa.HibernateOgmPersistence] against incoming persistence unit name [Mdb]
2022-07-22 18:29:58.432 [eventLoopGroupProxy-4-1] DEBUG o.h.jpa.boot.spi.ProviderChecker - Persistence-unit [Mdb] requested PersistenceProvider [org.hibernate.ogm.jpa.HibernateOgmPersistence]
2022-07-22 18:29:58.432 [eventLoopGroupProxy-4-1] TRACE o.h.jpa.boot.spi.ProviderChecker - Checking requested PersistenceProvider name [org.hibernate.ogm.jpa.HibernateOgmPersistence] against Hibernate provider names
2022-07-22 18:29:58.432 [eventLoopGroupProxy-4-1] DEBUG o.h.jpa.HibernatePersistenceProvider - Excluding from consideration due to provider mis-match
2022-07-22 18:29:58.433 [eventLoopGroupProxy-4-1] DEBUG o.h.jpa.HibernatePersistenceProvider - Found no matching persistence units
2022-07-22 18:29:58.434 [eventLoopGroupProxy-4-1] TRACE o.h.jpa.HibernatePersistenceProvider - Could not obtain matching EntityManagerFactoryBuilder, returning null
2022-07-22 18:29:58.550 [eventLoopGroupProxy-4-1] ERROR ktor.application - Unhandled: GET - /jpa
jakarta.persistence.PersistenceException: No Persistence provider for EntityManager named Mdb

If there's anything needed please do mention. I will edit my question. Is there anything wrong in my logic? Where am I making the mistake?

Anandakrishnan
  • 347
  • 1
  • 4
  • 18

0 Answers0