JPA 中的连接

发布于 2024-10-18 22:45:07 字数 74 浏览 5 评论 0原文

谁能告诉我,如果我定义了 jta-data-source,如何在 JPA 中获取事务?

问候,

萨蒂亚

Can anyone tell me how do I get transaction in JPA if I have defined jta-data-source?

Regards,

Satya

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

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

发布评论

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

评论(1

海螺姑娘 2024-10-25 22:45:07

对于 JTA 数据源,在其连接上完成的工作是 JTA 事务的一部分。这意味着您必须启动并提交或回滚 JTA 事务。

最简单的方法是在会话 bean 中执行 JPA 工作:

@Stateless
public class SomeBean {

    @PersistenceContext
    private EntityManager entityManager;

    public void doStuff() {
        // … do some stuff
        entityManager.persist(someObj);
    }
}

在这种情况下,事务将在进入 doStuff() 方法时启动,并在离开该方法时结束。

但是,如果您出于某种原因想要在其他类型的 bean(例如 JSF 托管 bean、Servlet、Servlet 过滤器等)中手动启动事务,则可以直接使用 API:

public class SomeBean {

    @Resource
    private UserTransaction tx;

    public void doStuff() {
        try {
            tx.begin();
            // … do some stuff
            entityManager.persist(someObj);
            tx.commit();
        }
        catch (Throwable t) {
            tx.rollback();
            throw t;
        }
    }
}

使用会话 bean 及其 so所谓的声明式事务几乎总是推荐的方法。

With a JTA data source, work done on its connections is part of a JTA transaction. This means you have to start and commit or rollback a JTA transaction.

The easiest way to do this is by doing the JPA work inside a session bean:

@Stateless
public class SomeBean {

    @PersistenceContext
    private EntityManager entityManager;

    public void doStuff() {
        // … do some stuff
        entityManager.persist(someObj);
    }
}

In this case the transaction will start when entering the doStuff() method and ends when leaving it.

But if you, for some reason, want to start the transaction manually in some other type of bean (e.g. a JSF managed bean, a Servlet, Servlet filter, etc), you can use the API directly:

public class SomeBean {

    @Resource
    private UserTransaction tx;

    public void doStuff() {
        try {
            tx.begin();
            // … do some stuff
            entityManager.persist(someObj);
            tx.commit();
        }
        catch (Throwable t) {
            tx.rollback();
            throw t;
        }
    }
}

Using the session bean and its so called declarative transactions is nearly always the recommended approach.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文