首先,您不应该使DAO方法具有事务性,而应使服务方法具有事务性。
其次,使用Transactional是让Spring为您启动和提交/回滚事务的一种方法。因此,您不应该自己启动和提交事务。
第三:仅当您使用知道如何将Hibernate会话与事务相关联的事务管理器(通常是a
HibernateTransactionManager)时,此方法才有效。会话工厂也应该由Spring处理,并由Spring注入您的DAO中。DAO的代码应如下所示:
第四:您不应该打开一个新会话,而是要获取一个与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); }}阅读文档以获取更多信息。



