package di import com.google.inject.{Inject, Provider} import jakarta.inject.Singleton import jakarta.persistence.{EntityManager, EntityManagerFactory, Persistence} import play.api.Configuration @Singleton class EntityManagerProvider @Inject()(config: Configuration) extends Provider[EntityManager] { private val emf: EntityManagerFactory = { val dbConfig = config.get[Configuration]("db.default") val props = new java.util.HashMap[String, Object]() // Map Play configuration to Jakarta Persistence properties props.put("jakarta.persistence.jdbc.driver", dbConfig.get[String]("driver")) props.put("jakarta.persistence.jdbc.url", dbConfig.get[String]("url")) props.put("jakarta.persistence.jdbc.user", dbConfig.get[String]("username")) props.put("jakarta.persistence.jdbc.password", dbConfig.get[String]("password")) // Also pass HikariCP settings if present dbConfig.getOptional[Configuration]("hikaricp").foreach { hikariConfig => hikariConfig.keys.foreach { key => val value = hikariConfig.underlying.getValue(key).unwrapped() props.put(s"hibernate.hikari.$key", value) } } Persistence.createEntityManagerFactory("defaultPersistenceUnit", props) } override def get(): EntityManager = { emf.createEntityManager() } def close(): Unit = { if (emf.isOpen) { emf.close() } } }