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