2012-01-19 92 views
1

我在我的web應用程序中使用Spring與Hibernate,我傾向於使用HibernateDaoSupport,因爲它會自動打開會話並關閉會話。我有兩個實體Route(route_id, source, destination)Stop(stop_id, latitude, longitude)。這兩個表格之間的關係是多對多的。一條路線可以包含多個站點,一個站點可以包含多條路線。Spring與Hibernate DAO層?

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

這真的取決於你想要做什麼。既然你使用Spring,你可以讓它爲你管理你的交易。關於Spring的好處是您可以添加事務支持,而對代碼幾乎沒有影響。

您需要

1)建立一個事務管理器在你的configuraiton
2)決定要如何劃分您的交易。
3)刪除代碼中的所有try/catch塊。如果讓他們離開,您的交易將不會回滾 - 除非您以編程方式管理交易,否則當異常冒泡時,Spring管理的交易通常會回滾。

Here is the Spring documentation on Transactions.它包含有關如何配置事務管理器以及如何配置聲明式事務管理(讓容器爲您完成大部分工作)的示例。

順便說一句,不再推薦使用Spring事務模板。 See this as for why

1

不,您必須開始交易。但使用HibernateDaoSupport已經過時了。您最好使用JPA EntityManager而不是原始休眠。那麼你不需要在你的DAO中擴展任何類。

交易可以用彈簧提供的declarative transaction management支持開始。閱讀鏈接的文檔,但總之 - 你用@Transactional註解了一個方法,它開始一個事務。除此之外,它還開設了一個新的會議。