Весна со слоем Hibernate DAO? - PullRequest
1 голос
/ 20 января 2012

Я использую Spring с 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 ]

1 голос
/ 20 января 2012

Нет, вы должны начать транзакцию. Но использование HibernateDaoSupport немного устарело. Вам лучше использовать JPA EntityManager вместо сырого спящего режима. Тогда вам не нужно расширять какой-либо класс в ваших DAO.

Транзакции могут быть начаты с поддержкой декларативного управления транзакциями , предоставляемой Spring. Прочтите связанную документацию, но вкратце - вы аннотируете метод с помощью @Transactional, и он запускает транзакцию. В дополнение к этому он также открывает новый сеанс.

0 голосов
/ 20 января 2012

Это действительно зависит от того, что вы хотите сделать.Поскольку вы используете Spring, вы можете позволить ему управлять своими транзакциями за вас.Самое замечательное в Spring - это то, что вы можете добавить поддержку транзакций с небольшим влиянием на ваш код.

Вам необходимо

1) Настроить TransactionManager в своей конфигурации
2) Решите, какхочу разграничить ваши транзакции.
3) Удалите все блоки try / catch в вашем коде.Если вы оставите их, ваши транзакции не будут откатываться - управляемые Spring транзакции обычно откатываются, когда возникает исключение, если вы не управляете своими транзакциями программно.

Вот документация Springon Транзакции. Содержит примеры того, как настроить менеджер транзакций и как настроить декларативное управление транзакциями (позволяя контейнеру выполнять большую часть работы за вас).

Кстати, использование транзакции SpringШаблон больше не рекомендуется. Посмотрите, почему .

...