首先,您不应该使DAO方法具有事务性,而应使服务方法具有事务性。
其次,使用Transactional是让Spring为您启动和提交/回滚事务的一种方法。因此,您不应该自己启动和提交事务。
第三:仅当您使用知道如何将Hibernate会话与事务相关联的事务管理器(通常是aHibernateTransactionManager
)时,此方法才有效。会话工厂也应该由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);
}
}