在 Javalin 应用程序中使用 JPA

发布于 2025-01-11 02:16:29 字数 845 浏览 0 评论 0 原文

我正在用 Java 创建一个 Web 应用程序,并希望使用 Javalin 框架。

问题:

  • 使用 JPA(通过 hibernate) noreferrer">Javalin Web 应用程序?
  • 即,使 JPA EntityManager 对象可用于 Javalin 请求处理程序的最佳方法是什么?

更新:更多上下文

我想在我的 javalin 应用程序中使用 JPA(通过 Hibernate)。 JPA 的中心概念是使用 EntityManager 实例来访问数据库。要创建 EntityManager,需要有一个 EntityManagerFactory

我当前所做的是创建一个全局 EntityManagerFactory 和使用数据库调用 factory.createEntityManager() 的处理程序。

虽然这有效,但我想知道是否还有其他推荐的方法?来自 Flask/SQLAlchemy/Python 背景 - 在该堆栈上,ORM 会话(EntityManager 等效项)通常可用作请求绑定对象。

I am creating a web application in Java and would like to use the Javalin framework.

Issues/questions:

  • What would be the best way to use JPA (via hibernate) in a Javalin web application?
  • I.e. what is the best way make a JPA EntityManager object available to the Javalin request handlers?

Update: Some more context

I want to use JPA (via Hibernate) in my javalin application. The central concept in JPA is that you use an EntityManager instance to access the database. To create an EntityManager, there is a EntityManagerFactory.

What I currently do is that I create a global EntityManagerFactory and the handlers that use the database call factory.createEntityManager().

While this works, I wonder if there are other recommended apporaches? Coming from a Flask/SQLAlchemy/Python background - on that stack the ORM session (EntityManager equivalent) is typically available as a request-bound object.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

要走干脆点 2025-01-18 02:16:29

我最终实现了以下内容:

  • 在启动时创建一个 EntityManagerFactory 。在启动时创建一个 Javalin 实例。然后调用enableRequestBoundEntityManager(javalinApp,entityManagerFactory)。
  • 每当处理程序需要 EntityManager 时,请使用扩展属性 Context.entityManager。

IE:

fun main() {
    val app = Javalin.create()
    val emf = createEntityManagerFactorySomehow()

    enableRequestBoundEntityManager(app, emf)

    app.get("/list/") { ctx -> ctx.json(
        ctx.entityManager.createQuery("select ... from ...").resultList
    ) }

    app.start()
}

/**
 * Adds an `entityManagerFactory` application attribute, and sets up clean up after requests have been handled
 */
fun enableRequestBoundEntityManager(app: Javalin, entityManagerFactory: EntityManagerFactory) {
    app.attribute("entityManagerFactory", entityManagerFactory)

    app.after {
        val entityManager: EntityManager? = it.attribute("entityManager")
        if (entityManager != null) {
            entityManager.close()
        }
    }
}

/**
 * Returns a JPA entity manager scoped to the Javalin context
 */
val Context.entityManager: EntityManager
    get() {
        if (this.attribute<EntityManager>("entityManager") == null) {
            this.attribute("entityManager", this.appAttribute<EntityManagerFactory>("entityManagerFactory").createEntityManager())
        }
        return this.attribute("entityManager")!!
    }

I ended up implementing the following:

  • Create an EntityManagerFactory on startup. Create a Javalin instance on startup. Then call enableRequestBoundEntityManager(javalinApp, entityManagerFactory).
  • Whenever a handler needs an EntityManager, use the extension property Context.entityManager.

I.e.:

fun main() {
    val app = Javalin.create()
    val emf = createEntityManagerFactorySomehow()

    enableRequestBoundEntityManager(app, emf)

    app.get("/list/") { ctx -> ctx.json(
        ctx.entityManager.createQuery("select ... from ...").resultList
    ) }

    app.start()
}

/**
 * Adds an `entityManagerFactory` application attribute, and sets up clean up after requests have been handled
 */
fun enableRequestBoundEntityManager(app: Javalin, entityManagerFactory: EntityManagerFactory) {
    app.attribute("entityManagerFactory", entityManagerFactory)

    app.after {
        val entityManager: EntityManager? = it.attribute("entityManager")
        if (entityManager != null) {
            entityManager.close()
        }
    }
}

/**
 * Returns a JPA entity manager scoped to the Javalin context
 */
val Context.entityManager: EntityManager
    get() {
        if (this.attribute<EntityManager>("entityManager") == null) {
            this.attribute("entityManager", this.appAttribute<EntityManagerFactory>("entityManagerFactory").createEntityManager())
        }
        return this.attribute("entityManager")!!
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文