事务没有回滚,但使用 Hibernate JPA 2.0 和 EJB3 与 BMT 提交

发布于 2024-11-17 21:02:07 字数 1343 浏览 1 评论 0原文

我一直在研究 JPA 2 和 ejb3 上的 hibernate。 所以我做了一个示例类来测试功能。我尝试过使用 BMT 交易,但遇到交易问题。 从下面的示例代码来看,如果 dosomething() 出现问题,将会抛出异常,因此 UserTransaction 将被回滚。 但是,我发现即使抛出异常,编辑的实体也会更新到数据库。如果我在设置中遗漏了某些内容,有人可以指出我吗?

@Stateless(mappedName = "MyManagementBean")
    @Local
    @TransactionManagement(TransactionManagementType.BEAN)


    public class MyManagement implements MyManagementLocal,MyManagementRemote {

        @PersistenceUnit(unitName="MyEjb") EntityManagerFactory emf;
        @Resource UserTransaction utx;
        @Resource SessionContext ctx;

        /**
         * Default constructor. 
         */
        public MyManagement () {
            // TODO Auto-generated constructor stub
        }

        public void dosomething(String id) throws Exception
        {

            try {
                utx.begin();    
                em = emf.createEntityManager();

                Myline line = em.find(Myline.class, id);

                line.setStatus("R");

                em.flush();
                utx.commit();
            }
            catch (Exception e) {
                e.printStackTrace();
                if (utx != null) utx.rollback();
                throw e; // or display error message
            }
            finally {
                em.close();
            }       
        } 

I have been studying about JPA 2 with hibernate on ejb3.
So I made a sample class to test the functionalities. I have tried using BMT transactions but facing problem on transaction.
From the sample code below, if something goes wrong in dosomething(), an exception will be thrown and so UserTransaction will be rollbacked.
However, I find that the edited entity is updated to the DB even the exception is thrown. Can anyone point me out if I am missing something in the setting?

@Stateless(mappedName = "MyManagementBean")
    @Local
    @TransactionManagement(TransactionManagementType.BEAN)


    public class MyManagement implements MyManagementLocal,MyManagementRemote {

        @PersistenceUnit(unitName="MyEjb") EntityManagerFactory emf;
        @Resource UserTransaction utx;
        @Resource SessionContext ctx;

        /**
         * Default constructor. 
         */
        public MyManagement () {
            // TODO Auto-generated constructor stub
        }

        public void dosomething(String id) throws Exception
        {

            try {
                utx.begin();    
                em = emf.createEntityManager();

                Myline line = em.find(Myline.class, id);

                line.setStatus("R");

                em.flush();
                utx.commit();
            }
            catch (Exception e) {
                e.printStackTrace();
                if (utx != null) utx.rollback();
                throw e; // or display error message
            }
            finally {
                em.close();
            }       
        } 

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

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

发布评论

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

评论(1

栀梦 2024-11-24 21:02:07

异常的类型是什么?程序是否曾调用过

utx.rollback();

尝试

e.printStackTrace();
if (utx != null) {
    utx.rollback();
    system.error.println("Rolled Back");
}                
throw e; // or display error message

What is the type of the exception ?. Does program ever hit the call to

utx.rollback();

try

e.printStackTrace();
if (utx != null) {
    utx.rollback();
    system.error.println("Rolled Back");
}                
throw e; // or display error message
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文