1. <tfoot id='s80es'></tfoot>

      <legend id='s80es'><style id='s80es'><dir id='s80es'><q id='s80es'></q></dir></style></legend>
        <bdo id='s80es'></bdo><ul id='s80es'></ul>
    2. <small id='s80es'></small><noframes id='s80es'>

      <i id='s80es'><tr id='s80es'><dt id='s80es'><q id='s80es'><span id='s80es'><b id='s80es'><form id='s80es'><ins id='s80es'></ins><ul id='s80es'></ul><sub id='s80es'></sub></form><legend id='s80es'></legend><bdo id='s80es'><pre id='s80es'><center id='s80es'></center></pre></bdo></b><th id='s80es'></th></span></q></dt></tr></i><div id='s80es'><tfoot id='s80es'></tfoot><dl id='s80es'><fieldset id='s80es'></fieldset></dl></div>
    3. 关于方法上的 Spring @Transactional 注释的一些说明

      时间:2023-07-26

      • <legend id='4tzbk'><style id='4tzbk'><dir id='4tzbk'><q id='4tzbk'></q></dir></style></legend>
          • <bdo id='4tzbk'></bdo><ul id='4tzbk'></ul>

                <tfoot id='4tzbk'></tfoot>

                <i id='4tzbk'><tr id='4tzbk'><dt id='4tzbk'><q id='4tzbk'><span id='4tzbk'><b id='4tzbk'><form id='4tzbk'><ins id='4tzbk'></ins><ul id='4tzbk'></ul><sub id='4tzbk'></sub></form><legend id='4tzbk'></legend><bdo id='4tzbk'><pre id='4tzbk'><center id='4tzbk'></center></pre></bdo></b><th id='4tzbk'></th></span></q></dt></tr></i><div id='4tzbk'><tfoot id='4tzbk'></tfoot><dl id='4tzbk'><fieldset id='4tzbk'></fieldset></dl></div>

                <small id='4tzbk'></small><noframes id='4tzbk'>

                  <tbody id='4tzbk'></tbody>
                本文介绍了关于方法上的 Spring @Transactional 注释的一些说明的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

                问题描述

                我是 Spring 世界的新手,我开发了一个使用 Spring 3.2.1 和 Hibernate 4.1.9 来实现 DAO 的简单项目.该项目工作正常,但我对在此 DAO 的 CRUD 方法上使用 @Transactional Spring 注释有一些疑问.

                I am quite new in Spring world and I have developed a simple project that use Spring 3.2.1 and Hibernate 4.1.9 to implement a DAO. The project work correctly but I have some doubts about the use of @Transactional Spring annotation on CRUD method of this DAO.

                这是实现我项目的CRUD操作的类的全部代码:

                This is the entire code of the class that implement the CRUD operation of my project:

                package org.andrea.myexample.HibernateOnSpring.dao;
                
                import java.util.List;
                
                import org.andrea.myexample.HibernateOnSpring.entity.Person;
                
                import org.hibernate.Criteria;
                import org.hibernate.HibernateException;
                import org.hibernate.Session;
                import org.hibernate.Transaction;
                import org.hibernate.SessionFactory;
                import org.hibernate.cfg.Configuration;
                import org.hibernate.service.ServiceRegistry;
                import org.hibernate.service.ServiceRegistryBuilder;
                import org.springframework.transaction.annotation.Transactional;
                
                public class PersonDAOImpl implements PersonDAO {
                
                    // Factory per la creazione delle sessioni di Hibernate:
                    private static SessionFactory sessionFactory;
                
                    // Metodo Setter per l'iniezione della dipendenza della SessionFactory:
                    public void setSessionFactory(SessionFactory sessionFactory) {
                        this.sessionFactory = sessionFactory;
                    }
                
                    /** CREATE CRUD Operation:
                     * Aggiunge un nuovo record rappresentato nella tabella rappresentato
                     * da un oggetto Person
                     */
                    @Transactional(readOnly = false)
                    public Integer addPerson(Person p) {
                
                        System.out.println("Inside addPerson()");
                
                        Session session = sessionFactory.openSession();
                
                        Transaction tx = null;
                        Integer personID = null;
                
                        try {
                            tx = session.beginTransaction();
                
                            personID = (Integer) session.save(p);
                            tx.commit();
                        } catch (HibernateException e) {
                            if (tx != null)
                                tx.rollback();
                            e.printStackTrace();
                        } finally {
                            session.close();
                        }
                
                        return personID;
                
                    }
                
                    // READ CRUD Operation (legge un singolo record avente uno specifico id):
                    public Person getById(int id) {
                
                        System.out.println("Inside getById()");
                
                        Session session = sessionFactory.openSession();
                
                        Transaction tx = null;          
                        Person retrievedPerson = null;  
                
                        try {
                            tx = session.beginTransaction();
                            retrievedPerson = (Person) session.get(Person.class, id);
                            tx.commit();
                        }catch (HibernateException e) { 
                            if (tx != null)                 
                                tx.rollback();          
                            e.printStackTrace();
                        } finally {                 
                            session.close();
                        }
                
                        return retrievedPerson;
                    }
                
                    // READ CRUD Operation (recupera la lista di tutti i record nella tabella):
                    @SuppressWarnings("unchecked")
                    public List<Person> getPersonsList() {
                
                        System.out.println("Inside getPersonsList()");
                
                        Session session = sessionFactory.openSession();
                        Transaction tx = null;
                        List<Person> personList = null;
                
                        try {
                            tx = session.beginTransaction();
                            Criteria criteria = session.createCriteria(Person.class);
                            personList = criteria.list();
                            System.out.println("personList: " + personList);
                            tx.commit();
                        }catch (HibernateException e) { 
                            if (tx != null)                 
                                tx.rollback();          
                            e.printStackTrace();
                        } finally {
                            session.close();
                        }
                        return personList;
                    }
                
                    // DELETE CRUD Operation (elimina un singolo record avente uno specifico id):
                    public void delete(int id) {
                
                        System.out.println("Inside delete()");
                
                        Session session = sessionFactory.openSession();
                        Transaction tx = null;
                
                        try {
                            tx = session.beginTransaction();
                            Person personToDelete = getById(id);
                            session.delete(personToDelete);
                            tx.commit();
                        }catch (HibernateException e) { 
                            if (tx != null)                 
                                tx.rollback();          
                            e.printStackTrace();
                        } finally {
                            session.close();
                        }
                
                    }
                
                    @Transactional
                    public void update(Person personToUpdate) {
                
                        System.out.println("Inside update()");
                
                        Session session = sessionFactory.openSession();
                        Transaction tx = null;
                
                        try {
                            System.out.println("Insite update() method try");
                            tx = session.beginTransaction();
                            session.update(personToUpdate);
                
                            tx.commit();
                        }catch (HibernateException e) { 
                            if (tx != null)                 
                                tx.rollback();          
                            e.printStackTrace();
                        } finally {
                            session.close();
                        }   
                
                    }
                
                }
                

                好的,你可以看到一些方法是使用@Transactional注解来注解的.

                Ok,as you can see some methods are annoted using @Transactional annotation.

                我在这里阅读官方文档 http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/transaction.html关于在方法上使用这个注释,它看到:使用@Transactional 注释的方法必须具有事务语义,但它对事务语义意味着什么?

                I am readin the official documentation here http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/transaction.html about the use of this annotation on methods and it see that: A method annoted using @Transactional must have transactional semantics but what it means with transactional semantics?

                意思是methos的执行必须被认为是事务的执行?所以这意味着方法操作必须被视为可能导致成功或失败的单个操作,如果成功,则操作结果必须是永久的,而如果失败则返回到之前的状态交易的开始.

                It means that the methos execution has to be considered as the execution of a transaction? So it means that the method operations have to be considered as a single operation that which may lead to a success or a failure, if successful, the results of operations has to be permanent, whereas in case of failure to return to the state prior to the start of the transaction.

                这就是在方法上使用@Transactional注解的意思吗?

                Is this the meaning of use @Transactional annotation on a method?

                addPerson() 方法的@Transactional 注释中的readOnly = false 属性究竟是什么意思?这意味着我也可以在数据库中写入一条记录(而不仅仅是读取它)还是什么?这个疑问是相关的,因为我知道,默认情况下,使用 @Transactional 注释定义的事务是 read/write 而不仅仅是读取...我也尝试删除 (readOnly = false) 属性并且仍然可以正常工作(在数据库表中插入新记录)

                And what exactly mean the readOnly = false attribute in the @Transactional annotation of the addPerson() method? it mean that I can also write a record in the database (and not only read it) or what? The doubt is related because I have understand that, by default, a transaction definied using @Transactional annotaion is read/write and not just read... I have also try to delete the (readOnly = false) attribute and still work well (insert the new record in the database table)

                下面的问题是:为什么有些方法使用@Transactional 注释而其他一些方法没有?用@Transactional 注释所有CRUD 方法是一个好习惯吗?"

                The following dout is: "why some method are annoted using @Transactional annotation and some other methods not? is it a good pratcice to annote ALL CRUD method withd @Transactional?"

                Tnx

                安德烈亚

                推荐答案

                首先,你不应该让 DAO 方法成为事务性的,而是服务性的方法.

                First of all, you shouldn't make DAO methods transactional, but service methods.

                其次,使用 Transactional 是一种让 Spring 为您启动和提交/回滚事务的方法.所以你不应该自己开始和提交事务.

                Second, using Transactional is a way to let Spring start and commit/rollback transactions for you. So you shouldn't start and commit transactions yourself.

                第三:这只有在您使用知道如何将 Hibernate 会话与事务关联的事务管理器(通常是 HibernateTransactionManager)时才有效.会话工厂也应该由 Spring 处理,并由 Spring 在您的 DAO 中注入.DAO 的代码应该是这样的:

                Third: this will only work if you use a transaction manager that knows how to associate a Hibernate session with the transaction (typically, a HibernateTransactionManager). The session factory should also be handled by Spring, and injected by Spring in your DAOs. The code of the DAO should look like this:

                第四:你不应该打开一个新的会话,而是获取当前会话,通过 Spring 关联到当前事务.

                Fourth: you should not open a new session, but get the current one, associated to the current transaction by Spring.

                public class PersonDAOImpl implements PersonDAO {
                
                    @Autowired
                    private SessionFactory sessionFactory;
                
                    public Integer addPerson(Person p) {
                        Session session = sessionFactory.getCurrentSession();
                        Integer personID = (Integer) session.save(p);
                        return personID;
                    }
                
                    public Person getById(int id) {
                        Session session = sessionFactory.getCurrentSession();
                        Person retrievedPerson = (Person) session.get(Person.class, id);
                        return retrievedPerson;
                    }
                
                    @SuppressWarnings("unchecked")
                    public List<Person> getPersonsList() {
                        Session session = sessionFactory.getCurrentSession();
                        Criteria criteria = session.createCriteria(Person.class);
                        return criteria.list();
                    }
                
                    public void delete(int id) {
                        Session session = sessionFactory.getCurrentSession();
                        Person personToDelete = getById(id);
                        session.delete(personToDelete);
                    }
                
                    public void update(Person personToUpdate) {
                        Session session = sessionFactory.getCurrentSession();
                        session.update(personToUpdate);
                    }
                }
                

                阅读 文档了解更多信息.

                这篇关于关于方法上的 Spring @Transactional 注释的一些说明的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!

                上一篇:代码风格;将javadoc放在注释之前还是之后? 下一篇:如何在 Hibernate 中持久化字符串列表?

                相关文章

                最新文章

                    <bdo id='dOtK8'></bdo><ul id='dOtK8'></ul>
                  <tfoot id='dOtK8'></tfoot>

                  <small id='dOtK8'></small><noframes id='dOtK8'>

                1. <i id='dOtK8'><tr id='dOtK8'><dt id='dOtK8'><q id='dOtK8'><span id='dOtK8'><b id='dOtK8'><form id='dOtK8'><ins id='dOtK8'></ins><ul id='dOtK8'></ul><sub id='dOtK8'></sub></form><legend id='dOtK8'></legend><bdo id='dOtK8'><pre id='dOtK8'><center id='dOtK8'></center></pre></bdo></b><th id='dOtK8'></th></span></q></dt></tr></i><div id='dOtK8'><tfoot id='dOtK8'></tfoot><dl id='dOtK8'><fieldset id='dOtK8'></fieldset></dl></div>

                  1. <legend id='dOtK8'><style id='dOtK8'><dir id='dOtK8'><q id='dOtK8'></q></dir></style></legend>