Spring与Hibernate DAO层?

时间:2012-01-19 21:51:21

标签: hibernate spring-mvc dao

我在我的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课程。

2 个答案:

答案 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