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?