我使用Spring注解来管理,像这样我的交易:Spring的事务管理,而不@Transactional注解
@Transactional(readOnly = true)
public class AlertServiceImpl implements AlertService {
private AlertDAO alertDAO;
public List<Alert> getAlerts(){
List<Alert> alerts = alertDAO.getAlerts();
return alerts;
}
}
我想知道如果我忘了注解会发生什么:
// Oops! Forgot to use transactional annotation
public class AlertServiceImpl implements AlertService {
private AlertDAO alertDAO;
public List<Alert> getAlerts(){
List<Alert> alerts = alertDAO.getAlerts();
return alerts;
}
}
当alertDAO的实现如下:
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
// no annotation here either
public class HibernateAlertDAO extends HibernateDaoSupport implements AlertDAO {
public List<Alert> getAlerts(){
// some implementation details that define queryString
Query query = getSession().createQuery(queryString);
List<Alert> alerts = query.list();
return alerts;
}
}
好像Hibernate允许我获取数据从数据库甚至没有注释。
这种粗心大意的后果是什么?最糟糕的情况是什么?
关于你的问题,你可以得到一个会话流失,即会话被打开,但由于没有事务边界(春天用于打开/关闭会话)而没有关闭。你的dao有缺陷,你不应该在'HibernateDaoSupport'类上调用'getSession'(这会打开一个非托管的会话)。 (在2006年的某个地方,HibernateTemplate和HibernateDaoSupport必须被认为是弃用的!)。请参阅http://docs.spring.io/spring/docs/current/spring-framework-reference/html/orm.html#orm-hibernate-straight。 –
默认情况下,事务边界不是在服务调用返回的地方,还是服务线程(在webapp的情况下)返回MVC请求的地方?如果这是一个非网络应用场景,那么是的,会话流失是一个大问题。然而,因为它总是调用getSession(),它会返回当前会话,如果它存在不是吗?因为它存储在线程本地? –
@ M.Deinum你能提供类似问题的输入http://stackoverflow.com/questions/42831749/hibernate-session-with-spring-transaction? – emilly