我在我的Web应用程序中使用Spring with Hibernate,我倾向于使用HibernateDaoSupport
,因为它会自动打开会话和关闭会话。我有两个实体Route(route_id, source, destination)
和Stop(stop_id, latitude, longitude)
。这两个表之间的关系是多对多的。一条路线可以包含许多站点,一站可以包含许多路线。
Route.hbm.xml
:
<set name="stops" table="route_stop" cascade="all" lazy="false" order-by="stop_id asc">
<key column="route_id" />
<many-to-many column="stop_id" class="com.trackingsystem.model.Stop" />
</set>
Stop.hbm.xml
:
<set name="routes" table="route_stop" cascade="all" lazy="false" inverse = "false">
<key column="stop_id" />
<many-to-many column="route_id" class="com.trackingsystem.model.Route" />
</set>
这是DAO课程:
public class HibernateRouteStopsDAO extends HibernateDaoSupport implements RouteStopsDAO{
public Set<Stop> getStops(Route route){
return route.getStops();
}
public Route getRoute(int routeId){
return (Route)getSession().get(Route.class, routeId);
}
public Route getRoute(String source, String destination){
Session session = null;
Route route = null;
try{
session = getSession();
route = (Route)session.createCriteria(Route.class)
.add(Restrictions.eq("source", source))
.add(Restrictions.eq("destination", destination)).list().get(0);
}catch (Exception e) {
System.out.println("RouteStopsDAO "+e);
}finally{
}
return route;
}
@Override
public void persistRoute(Route route) {
Session session = null;
try{
session = getSession();
session.save(route);
}catch (Exception e) {
System.out.println("RouteStopsDAO "+e);
}
}
@Override
public void addStops(Route route, Stop stop) {
Session session = null;
try{
session = getSession();
route.getStops().add(stop);
stop.getRoutes().add(route);
session.update(route);
session.update(stop);
}catch (Exception e) {
System.out.println("RouteStopsDAO "+e);
}finally{
}
}
@Override
public List<Route> getAllRoutes() {
// TODO Auto-generated method stub
Session session = null;
List<Route> listOfRoutes = new ArrayList<Route>(0);
try{
session = getSession();
listOfRoutes = session.createCriteria(Route.class).list();
return listOfRoutes;
}catch (Exception e) {
System.out.println("RouteStopsDAO "+e);
return listOfRoutes;
}finally{
}
}
@Override
public void updateRoute(Route route) {
Session session = null;
try{
session = getSession();
session.update(route);
session.flush();
}catch (Exception e) {
System.out.println("RouteStopsDAO "+e);
}finally{
}
}
@Override
public void deleteAllStops(Route route) {
// TODO Auto-generated method stub
Session session = null;
try{
session = getSession();
session.delete(route);
}catch (Exception e) {
System.out.println("RouteStopsDAO "+e);
}finally{
//session.close();
}
}
@Override
public Stop getStop(int stopId) {
// TODO Auto-generated method stub
return (Stop) getSession().get(Stop.class, stopId);
}
@Override
public List<Route> getRoutes(String stopName) {
// TODO Auto-generated method stub
List<Route> routes = new ArrayList<Route>();
List<Stop> stops = getSession().createCriteria(Stop.class)
.add(Restrictions.eq("stopName", stopName)).list();
for(Stop stop : stops){
routes.addAll(stop.getRoutes());
}
return routes;
}
@Override
public List<Stop> getStops(String stopName) {
// TODO Auto-generated method stub
List<Stop> stops = new ArrayList<Stop>();
for(Route route : getRoutes(stopName)){
stops.addAll(route.getStops());
}
return stops;
}
@Override
public Stop getStop(String stopName) {
// TODO Auto-generated method stu
List<Stop> stops = getSession().createCriteria(Stop.class)
.add(Restrictions.eq("stopName", stopName)).list();
if(stops.size()>0)
return (Stop)stops.get(0);
else return null;
}
}
我不明白,我是否需要启动交易或HibernateDaoSupport
自动启动交易?请更新我的DAO课程。
答案 0 :(得分:1)
不,你必须开始交易。但使用HibernateDaoSupport
有点过时了。你最好使用JPA EntityManager
而不是原始的hibernate。然后,您不需要在DAO中扩展任何类。
可以使用spring提供的declarative transaction management支持启动事务。阅读链接文档,但简而言之 - 您使用@Transactional
注释方法并启动事务。除此之外,它还会打开一个新的会话。
答案 1 :(得分:0)
这实际上取决于你想做什么。由于您使用的是Spring,因此您可以让它为您管理交易。关于Spring的好处是你可以添加事务支持而对代码影响不大。
你需要
1)在配置中设置TransactionManager
2)决定如何划分交易。
3)删除代码中的所有try / catch块。如果您将它们保留,则您的事务将不会回滚 - 当异常冒泡时,Spring管理的事务通常会回滚,除非您以编程方式管理事务。
Here is the Spring documentation on Transactions.它包含有关如何配置事务管理器的示例,以及如何配置声明式事务管理(让容器为您完成大部分工作)。
顺便说一下,不再推荐使用Spring事务模板。 See this as for why