当前位置: 首页 > 面试题库 >

Seam POJO的手动交易

周滨海
2023-03-14
问题内容

不使用EJB时​​,将数据库事务与Seam一起使用的最佳实践是什么-即。将Seam部署为WAR时?

默认情况下,Seam
JavaBeans支持事务。我可以使用@Transactional注释方法,以确保需要进行事务处理。或者我可以使用@Transactional(NEVER)或@Transactional(MANDATORY)。我不知道怎么做是创建自己的事务,设置超时,开始然后提交/回滚。

我试过使用:

UserTransaction utx = Transaction.instance();
utx.setTransactionTimeout(2000);
utx.begin();

但是,如果事务已在进行中,则将其忽略;如果使用@Transactional(NEVER)注释该方法,则返回javax.transaction.NotSupportedException

任何帮助表示赞赏。谢谢。


问题答案:

如您所知,事务管理是一个跨领域的问题。因此,将代码分散在不是主要关注点的模块中并不是一个好主意。

如果在非EJB环境中使用JTA UserTransaction,则可以使用JTA(Apache Tomcat不支持JTA)。

1°法则

默认情况下 ,所有JSF请求(Seam 2.0+)都 启用 Seam事务管理。

我认为 Seam事务管理 听起来比 Seam管理的 事务
更好。这意味着Seam会在后台谨慎地调用begin和commit。Seam通过使用Seam事务管理器扮演事务管理器的角色

1°场景 :可用POJO + JTA(Apache Tomcat不支持JTA)

Seam使用的事务管理器:org.jboss.seam.transaction.UTtransaction

当JTA可用时,在非EJB环境(战争)中默认启用(JBoss支持JTA)

如果您使用的是JPA EntityManager或Hibernate Session,则需要注册它们以允许Seam管理事务边界

参见9.3。Seam管理的持久性上下文如何设置Seam管理的持久性上下文(使用@In注入)

然后使用@In(作用域为ScopeType.CONVERSATION)注入EntityManager(EntityManager)或Session(hibernate)。

@Name("businessService")
public class BusinessServiceImpl implementes BusinessService {

    @In
    private EntityManager entityManager;

    public void doSomething() {
        // You do not need to call entityManager().getTransaction().begin();
        // because Seam Transaction Manager takes care of it
        // By using proxies
        // Therefore, if you call entityManager().getTransaction().begin()
        // You will get IllegalStateException

        // Some EntityManager operations persist, find etc

        // You do not need to call entityManager().getTransaction().commit();
        // because Seam Transaction Manager takes care of it
        // By using proxies
    }

}

在后台,Seam Transaction
Manager通过调用joinTransaction方法在活动的JTA
UserTransaction中注册EntityManager(JPA)或Session(hibernate)

2°场景 :POJO + RESOURCE_LOCAL(hibernate或JPA)事务

Seam(JPA)使用的事务管理器:org.jboss.seam.transaction.EntityTransaction

Seam(Hibernate)使用的事务管理器:org.jboss.seam.transaction.HibernateTransaction

参见9.3。Seam管理的持久性上下文如何设置Seam管理的持久性上下文(使用@In注入)

在后台,Seam Transaction Manager通过使用代理来处理调用begin和commit的底层技术

3°场景 :EJB

Seam使用的事务管理器:org.jboss.seam.transaction.CMTTransaction

在EJB环境中默认启用。请注意,在这种情况下,Seam不控制容器管理的事务。

问候,



 类似资料:
  • 我正在使用方法级别的@KafkaHandler(类级别的@KafkaListener)消费Kafka事件。 我见过很多例子,其中有一个“acknowledge”参数可用,在这个参数上可以调用“acknowledge()”方法来提交事件的消耗,但是,当我将它作为参数包含到我的方法中时,我无法填充acknowledge对象。使用KafkaHandler时如何手动提交?有可能吗? 代码示例: 使用Spr

  • 问题内容: 我正在使用Spring / Spring-data-JPA,发现自己需要在单元测试中手动强制提交。我的用例是我正在做一个多线程测试,其中我必须使用在生成线程之前保留的数据。 不幸的是,鉴于测试正在事务中运行,即使不能使它也不能被衍生线程访问。 我尝试使用实体管理器来执行操作,但是在执行此操作时收到错误消息: 有什么方法可以提交事务并继续进行吗?我一直找不到任何允许我调用的方法。 问题答

  • 问题内容: 通常,播放!在请求成功完成后提交事务。在Play中手动提交交易的正确方法是什么? 问题答案: 您可以通过调用JPA.em()获得Hibernate EntityManager。然后,您可以从那里访问事务(JPA.em()。getTransaction())。 如果您打算自己管理事务,则将要禁用Play!的事务处理(可以在方法或控制器上使用@NoTransaction注释来执行此操作)。

  • 我正在使用ReplyingKafkaTemplate.sendAndReception()发送和接收由相关ID关联的消息。用例有许多主题正在进行中,我需要手动acknoledge(提交)消耗的消息偏移量。到目前为止还不错,这是使用: 但我不知道如何手动确认最后一条消息(sendAndReceive()使用的消息)。 有什么提示吗? 谢谢 费尔南多

  • 但是我没能做到这一点,也就是说,我有一个需要多个签名的策略,所以我用这两个组织的MSP信息先后在事务文件(.tx)上签名,但是当我提交事务时,订单者或同行会拒绝它,说“签名集不满足策略...”。 奇怪的是,这个检查忽略了我所做的其他签名,它只会认为签名是由提交事务的命令自动完成的:peer channel update或peer chaincode实例化,就好像最后一个签名使我之前手动应用的签名无