safdoescode
safdoescode

Reputation: 88

(JAVA EE) Method not working without throwing any error

I'm developping an airline management web application with Java EE, EJB & JPA (EclipseLink)

I'm having a trouble when i'm calling a method in the service layer from a servlet : The method don't do what expected without having any error.

The method is AddPassengerToFlight where i am trying to add a passenger to the passengers list that i have in the flight entity with a ManyToMany relationship.

This is the structure of the priject.

This is the Flight and The Passenger Entities whitout the getters and setters:

Flight:

public class Flight implements Serializable {


    @Id
    @GeneratedValue( strategy = GenerationType.AUTO )
    private Integer         id;

    @Enumerated( EnumType.STRING )
    private Cities          depart;

    @Enumerated( EnumType.STRING )
    private Cities          destination;

    private String          prix;

    @Temporal( TemporalType.TIMESTAMP )
    private Date            date;

    @ManyToMany( cascade = { CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH } )
    @JoinTable( name = "f_p_join", joinColumns = @JoinColumn( name = "flight_fk" ), inverseJoinColumns = @JoinColumn( name = "passenger_fk" ) )
    private List<Passenger> passengers;

    @OneToOne( )
    @JoinColumn( name = "airplane_fk" )
    private Plane           airplane;

    @OneToOne( )
    @JoinColumn( name = "pilot_fk" )
    private Pilot           pilot;
}

Passenger:

public class Passenger implements Serializable {


    @Id
    @GeneratedValue( strategy = GenerationType.AUTO )
    private Integer      id;

    private String       nom;

    private String       prenom;

    private String       adresse;

    private String       telephone;

    private String       email;

    @Enumerated( EnumType.STRING )
    private FlightClass  flightClass;

    @ManyToMany( mappedBy = "passengers" )
    private List<Flight> flights;
}

The PassenerService where i have the method :

public class PassengerService {

    private static final String CHAMP_FLIGHT_ID    = "flightId";
    private static final String CHAMP_PASSENGER_ID = "passengerId";

    private String              resultat;
    private Map<String, String> erreurs            = new HashMap<String, String>();
    private PassengerDao        passengerDao;
    private FlightDao           flightDao;
    private PilotDao            pilotDao;
    private PlaneDao            planeDao;

    public Map<String, String> getErreurs() {
        return erreurs;
    }

    public String getResultat() {
        return resultat;
    }

    public PassengerService( PassengerDao passengerDao, FlightDao flightDao, PilotDao pilotDao, PlaneDao planeDao ) {
        this.passengerDao = passengerDao;
        this.flightDao = flightDao;
        this.pilotDao = pilotDao;
        this.planeDao = planeDao;
    }

    public Passenger createPassenger( HttpServletRequest request ) {
        //The createPassenger code
    }

    public List<Passenger> getAllPassengers() {
        //The getAllPassengers Code
    }

    public void AddPassengerToFlight( HttpServletRequest request ) {
        FlightService flightService = new FlightService( flightDao, planeDao, pilotDao );

        String passengerId = request.getParameter( CHAMP_PASSENGER_ID );
        String flightId = request.getParameter( CHAMP_FLIGHT_ID );

        Passenger passenger = getPassengerById( passengerId );
        Flight flight = flightService.getFlightById( flightId );

        List<Passenger> pList = flight.getPassengers();
        pList.add( passenger );
        flight.setPassengers( pList );

        passenger.getFlights().add( flight );

    }

    public Passenger getPassengerById( String passengerId ) {
        Passenger passenger = passengerDao.getPassengerById( passengerId );
        return passenger;
    }

    public void removePassenger( Passenger passenger ) {
       //The removePassenger code

    }


}

And this is the servlet AddPassengerToFlight

@WebServlet( "/AddPassengerToFlight" )
public class AddPassengerToFlight extends HttpServlet {

    private static final String VUE_REDIRECT     = "/airline/PassengerList";

    private static final long   serialVersionUID = 1L;

    @EJB
    FlightDao                   flightDao;

    @EJB
    PilotDao                    pilotDao;

    @EJB
    PlaneDao                    planeDao;

    @EJB
    PassengerDao                passengerDao;


    protected void doGet( HttpServletRequest request, HttpServletResponse response ) throws ServletException,
            IOException {
        FlightService flightService = new FlightService( flightDao, planeDao, pilotDao );
        PassengerService passengerService = new PassengerService( passengerDao, flightDao, pilotDao, planeDao );

        List<Flight> flights = flightService.getAllFlights();
        List<Passenger> passengers = passengerService.getAllPassengers();
        request.setAttribute( "flights", flights );
        request.setAttribute( "passengers", passengers );
        this.getServletContext().getRequestDispatcher( VUE ).forward( request, response );
    }


    protected void doPost( HttpServletRequest request, HttpServletResponse response ) throws ServletException,
            IOException {
        PassengerService passengerService = new PassengerService( passengerDao, flightDao, pilotDao, planeDao );

        passengerService.AddPassengerToFlight( request );
        response.sendRedirect( VUE_REDIRECT );

    }

}

And this is the form AddPassengerToFlight (The JSP File)

<div class="container">
        <h2>Adding Passenger To Flight</h2>
        <br/><br/>
        <form method="POST" action="AddPassengerToFlight">
            <div class="form-group">
                <h4>Flight :</h4>
                <select name="flightId" class="selectpicker" data-live-search="true" data-width="100%">
                    <c:forEach items="${flights}" var="flight">
                        <option value="${flight.id}">
                            FROM <c:out value="${flight.depart}" /> TO <c:out value="${flight.destination}" /> AT <c:out value="${flight.date}" />
                        </option>
                    </c:forEach>
                </select>
            </div>


            <div class="form-group">
                <h4>Passenger :</h4>
                <select name="passengerId" class="selectpicker" data-live-search="true" data-width="100%">
                    <c:forEach items="${passengers}" var="passenger">
                        <option value="${passenger.id}"><c:out value="${passenger.nom}" /></option>
                    </c:forEach>
                </select>
            </div>

            <button type="submit" class="btn btn-default">Submit</button>

        </form>
    </div>

When i click the button submit of the AddPassengerToFlight im redirected to the PassengerList But Nothing happens between the two entities (Flight and Passenger) and i have no error.

Can anyone figure out what i am doing wrong here ?

Upvotes: 1

Views: 139

Answers (1)

Carlitos Way
Carlitos Way

Reputation: 3424

I Believe that your problem is that your PassengerService Class is a plain JAVA Class (I explain, is not an EJB Service)... thus, when you make the association between Passanger and Flight in that class, there is no JTA transaction running and your entities are in detach mode; so, any changes on them will never be persisted at the database.

You can try this quickly to see if I'm correct... Make your Service an EJB Class and inject the required DAOs through @EJB annotation, from the Servlet inject your new EJB and then invoke the method: AddPassengerToFlight( HttpServletRequest request ) ...

Upvotes: 1

Related Questions